二叉树的二叉链表表示与实现

来源:互联网 发布:focusky mac 破解版 编辑:程序博客网 时间:2024/05/17 00:27

二叉树的特点是每个结点至多只有两棵子树,且二叉树有左右字子树之分,次序不能任意颠倒。二叉树的存储结构可以用顺序存储和链式存储来存储。二叉树一般使用链式存储结构,由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左右孩子的指针构成,即二叉树的链表结点中包含3个域,这种结点结构的二叉树存储结构称之为二叉链表。

typedef struct tnode {      elemtype        data;      struct tnode        *lchild;      struct tnode        *rchild;  }*bitree, bitnode;  

创建一棵二叉树

int create_bitree(bitree *bt)  {      elemtype    data;      scanf("%d", &data);      if (0 == data) {          *bt = NULL;      } else {          *bt = (bitree)malloc(sizeof(bitnode));          if (!(*bt))              exit(OVERFLOW);          (*bt)->data = data;          create_bitree(&(*bt)->lchild);          create_bitree(&(*bt)->rchild);      }      return OK;  }  

二叉树的遍历

//先序void preorder(bitree bt, int (*visit)(elemtype e))  {      if (bt) {          visit(bt->data);          preorder(bt->lchild, visit);          preorder(bt->rchild, visit);      }  }  //中序void inorder(bitree bt, int (*visit)(elemtype e))  {      if (bt) {          inorder(bt->lchild, visit);          visit(bt->data);          inorder(bt->rchild, visit);      }  }  //后序void postorder(bitree bt, int (*visit)(elemtype e))  {      if (bt) {          postorder(bt->lchild, visit);          postorder(bt->rchild, visit);          visit(bt->data);      }  }  

二叉树的深度

int get_tree_depth(bitree bt)  {      int ldepth, rdepth;      if (!bt)          return 0;      else if (!bt->lchild && !bt->rchild)          return 1;      else {          ldepth = get_tree_depth(bt->lchild);          rdepth = get_tree_depth(bt->rchild);          return (ldepth > rdepth ? ldepth : rdepth) + 1;      }  }  

叶子结点数

int get_num_of_leave(bitree bt)  {      if (!bt)          return 0;      else if (!bt->lchild && !bt->rchild)          return 1;      else          return (get_num_of_leave(bt->lchild) + get_num_of_leave(bt->rchild));  }  

释放二叉树

void free_bitree(bitree *bt)  {      if (*bt) {          if ((*bt)->lchild)              free_bitree(&(*bt)->lchild);          if ((*bt)->rchild)              free_bitree(&(*bt)->rchild);              free(*bt);              *bt = NULL;      }  }  
原创粉丝点击