二叉树1——创建与插入节点

来源:互联网 发布:网络服务器托管 编辑:程序博客网 时间:2024/06/06 05:20

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。

本文主要讲的是一些关于二叉树的操作。
首先我依旧先建立几个数据结构;

typedef char BTreeData;// 二叉树的结点typedef struct _btreeNode{    BTreeData data;    struct _btreeNode *lchild;   // 指向左孩子结点的指针    struct _btreeNode *rchild;   // 指向右孩子结点的指针}BTreeNode;

一个树节点的数据结构,其中有BTreeData类型的数据,一个指向左孩子的节点的指针lchild,指向右孩子节点的指针rchild.

typedef struct _btree{    BTreeNode *root;     // 指向二叉树的根节点    int  count;          // 记录二叉树结点的个数}BTree;

一个树的数据结构,有一个指向根节点的指针,和一个记录节点数的count。

有了这两个数据结构,一个二叉树的框架就搭建起来了。下面我们开始一些相关的操作。
创建二叉树:

BTree *Create_BTree(){    BTree *btree = (BTree*)malloc(sizeof(BTree)/sizeof(char));    if (btree == NULL)        return NULL;    btree->count = 0;    btree->root  = NULL;    return btree;}

创建二叉树比较简单,将根节点置为NULL就好了。并给树赋长度0;

插入节点:

int Btree_Insert(BTree *tree, BTreeData data, int pos, int count, int flag){    if (tree == NULL || (flag != BLEFT && flag != BRIGHT))        return FALSE;    BTreeNode *node = (BTreeNode*)malloc(sizeof(BTreeNode)/sizeof(char));    if (node == NULL)        return FALSE;    node->data = data;    node->lchild = NULL;    node->rchild = NULL;    // 找插入的位置    BTreeNode *parent = NULL;    BTreeNode *current = tree->root; // current 一开始指向根节点,根节点的父节点是空    int way;   // 保存当前走的位置    while (count > 0 && current != NULL)    {        way = pos & 1;    // 取出当前走的方向        pos = pos >> 1;   // 移去走过的路线        // 因为当前位置就是走完以后的位置的父节点        parent = current;        if (way == BLEFT)   // 往左走            current = current->lchild;        else            current = current->rchild;        count--;    }    // 把被替换掉的结点插入到新节点下面    if (flag == BLEFT)        node->lchild = current;    else        node->rchild = current;    // 把新节点插入到二叉树中,way保存了应该插入在父节点的左边还是右边    if (parent != NULL)    {        if (way == BLEFT)            parent->lchild = node;        else            parent->rchild = node;    }    else    {        tree->root = node;  // 替换根节点    }    tree->count ++;    return TRUE;}

二叉树的插入相对树的插入就简单了许多,但也是需要一番理解的,首先,需要找到想要插入的地方,然后用新建的节点替换原来的节点,然后根据需要将原先节点以及它的“子子孙孙”们加入到新建节点的左边或右边。总体来说也不是很难。

原创粉丝点击