当前位置:   article > 正文

【第三节】3.1二叉树的创建--五种方法(递归)_递归创建二叉树

递归创建二叉树

目录

前提二叉树的结构

1.有参数的输入型创建

2.无参数的输入型创建

3.给定字符串创建二叉树

4.给定先序和中序序列创建二叉树

5.给定中序和后序序列创建二叉树

补充:


前提
二叉树的结构

  1. typedef struct BinTreeNode
  2. {
  3. BTElemType data;//BTElemType是二叉树结点数据类型,为了便于代码的修改,可以是int,char......
  4. struct BinTreeNode *leftChild;
  5. struct BinTreeNode *rightChild;
  6. }BinTreeNode;
  7. typedef BinTreeNode *BinTree;

1.有参数的输入型创建

  • 按照输入的序列创建二叉树,分别递归的创建左子树和右子树
  • 如遇到‘#’代表子树为空
  1. void BinTreeCreate(BinTree *t)
  2. {
  3. assert(t);
  4. BTElemType item;
  5. scanf("%c", &item);
  6. if (item == '#'){//递归结束的条件
  7. *t = NULL;
  8. }
  9. else
  10. {
  11. *t = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  12. assert(*t != NULL);
  13. (*t)->data = item;
  14. BinTreeCreate(&(*t)->leftChild);
  15. BinTreeCreate(&(*t)->rightChild);
  16. }
  17. }

2.无参数的输入型创建

  • 有参数的是作为函数参数传进来,无参数是在函数内部创建,然后返回
  1. BinTree BinTreeCreate_1()
  2. {
  3. BTElemType item;
  4. scanf("%c", &item);
  5. if (item == '#'){
  6. return NULL;
  7. }
  8. else
  9. {
  10. BinTreeNode *t = (BinTreeNode *)malloc(sizeof(BinTreeNode));//创建t
  11. assert(t != NULL);
  12. t->data = item;
  13. t->leftChild = BinTreeCreate_1();
  14. t->rightChild = BinTreeCreate_1();
  15. return t;
  16. }
  17. }

3.给定字符串创建二叉树

  • 例如ABC##DE##F##G#H##,   字符串遍历到最后遇到‘\0’,或是遇到了'#'就结束递归 
  • 这里i为什么要传地址,是为了在函数里改变,也会影响主函数  
  • 注意(*i)++,改变索引的值,才能向后遍历字符串
  1. BinTree BinTreeCreate_2(const char *s, int *i)
  2. {
  3. assert(s);
  4. if (s[(*i)] == '\0' || s[(*i)] == '#'){
  5. return NULL;
  6. }
  7. else{
  8. BinTreeNode *t = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  9. assert(t != NULL);
  10. t->data = s[*i];
  11. (*i)++;
  12. t->leftChild = BinTreeCreate_2(s, i);
  13. (*i)++;
  14. t->rightChild = BinTreeCreate_2(s, i);
  15. return t;
  16. }
  17. }

4.给定先序和中序序列创建二叉树

  • 给定先序和中序遍历,可以唯一的确定一个二叉树
  • 先序遍历是先根,后左子树,再右子树,那先序序列的第一个元素就是根节点
  • 在中序序列中遍历寻找先序序列的第一个元素,以中序序列的这个元素为分界线,左边为树的左子树的结点,右边为右子树的结点

 

 

  1. BinTree BinTreeCreate_3(const char *vlr, const char *lvr, int n)
  2. {
  3. if (n == 0){
  4. return NULL;
  5. }
  6. int k = 0;
  7. while (vlr[0] != lvr[k]){//遍历寻找到根结点
  8. k++;
  9. }
  10. BinTreeNode *t = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  11. t->data = lvr[k];
  12. t->leftChild = BinTreeCreate_3(vlr + 1, lvr, k);//参数应该是先序序列的下一个结点,中序序列,中序序列到根节点的长度
  13. t->rightChild = BinTreeCreate_3(vlr + k + 1, lvr + k + 1, n - k - 1);//参数为先序序列的右子树开始位置,中序序列的根节点后面的序列,树的总长度减去左子树长度再减一
  14. return t;
  15. }

5.给定中序和后序序列创建二叉树

  • 给定后序和中序遍历,可以唯一的确定一个二叉树
  • 后序遍历是先左子树,后右子树,再根节点,那后序序列的最后一个元素就是根节点
  • 在中序序列中遍历寻找后序序列的第一个元素,以中序序列的这个元素为分界线,左边为树的左子树的结点,右边为右子树的结点

 

  1. BinTree BinTreeCreate_4(const char *lrv, const char *lvr, int n)
  2. {
  3. if (n == 0)
  4. return NULL;
  5. int k = 0;
  6. while (lrv[n-1] != lvr[k])
  7. k++;
  8. BinTreeNode *t = (BinTreeNode*)malloc(sizeof(BinTreeNode));
  9. t->data = lvr[k];
  10. t->leftChild = BinTreeCreate_4(lrv,lvr,k);
  11. t->rightChild = BinTreeCreate_4(lrv+k,lvr+1+k,n-k-1);
  12. return t;
  13. }

补充:

只有先序序列和后序序列,不能唯一的确定一个二叉树,例如下面的两个树的先序和后序序列都是ABCD

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/514480
推荐阅读
相关标签
  

闽ICP备14008679号