当前位置:   article > 正文

C语言编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。_已知二叉树采用二叉链表存储,编写程序,要求建立一颗二叉树,并输出横向显示的

已知二叉树采用二叉链表存储,编写程序,要求建立一颗二叉树,并输出横向显示的

一、题目

编程实现:二叉树采用二叉链表存储,要求建立一颗二叉树,并输出要求的二叉树树状形式与结点编号。结点如图1.1所示。

                                   

                                                                                  图 1.1

      其中,二叉树的num编号域为整数类型,data数据域为字符类型,要求生成二叉树中编号,从1开始进行连续编号,每个结点的编号大于其左右子树中孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,请给出对二叉树中结点的实现如上要求编号并按如下图1.2所示的二叉树树状形式打印出相应点编号的程序。

测试数据:AB凵D凵凵CE凵F凵凵凵 (其中符号“凵”代表空格)

                        

                                                                                  图1.2

 二、题目解析

  1、题目分析

       本题的要求就是输入一颗二叉树序列,然后输出这个二叉树的横向显示形状,并且按照编号要求输出二叉树横向显示形 状所对应的结点编号。

 2、解题思路

(1)根据题目要求可知本题考查了二叉树创建算法、二叉树横向树状打印算法、二叉树遍历算法。

(2)根据输入的数据和对应的二叉树可知,本题用二叉树的前序遍历创建一颗二叉树。

(3)比较二叉树和对应的二叉树树状,可看出对应的树状是二叉树的横向显示图

  分析:①二叉树的横向显示应是竖向显示的90°旋转。由下图2.1可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为CFEADB,这刚好是逆中序遍历序列。所以解决二叉树横向显示问题采用“逆中序”遍历方法,因此横向显示算法先右子树、再根结点、再左子树的RDL结构。

  ②在这种输出格式中,结点的左、右位置与结点的层深(即结点所在高度)有关,所以在实现此算法(即实现函数)中设置一个表示当前结点层深的参数,以控制输出结点的左右位置,每当递归进层时层深参数加1。这些操作应在访问根结点时实现。

                                              

                                                                          图 2.1

(4)根据二叉树树状所对应的序列编号可知,每个结点对应的编号是二叉树后序遍历的顺序编号。即二叉树后序遍历             序列为DBFECA,所对应编号为123456。所以对二叉树编号的算法(即实现函数)就是用二叉树的后序遍历完成。

 

 三、代码实现

  1. typedef struct BiTNode{
  2. char data;
  3. int num;
  4. struct BiTNode *Lchild, *Rchild;
  5. }BiTNode,*BiTree;
  6. void createBiTree(BiTree &T){ //前序遍历创建二叉树
  7. char ch;
  8. ch=getchar();
  9. if (ch != ' '){
  10. T = (BiTree)malloc(sizeof(BiTNode));
  11. T->Lchild = T->Rchild = NULL;
  12. T->data = ch;
  13. createBiTree(T->Lchild);
  14. createBiTree(T->Rchild);
  15. }
  16. }
  17. int count = 1;
  18. void putNum(BiTree &T){ //由题可知,对二叉树按后序遍历进行编号
  19. if (T != NULL){
  20. putNum(T->Lchild);
  21. putNum(T->Rchild);
  22. T->num = count;
  23. count++;
  24. }
  25. }
  26. void printTree(BiTree T,int nLayer){ //输出要求的树状
  27. if (T == NULL) return;
  28. printTree(T->Rchild,nLayer+1);
  29. for (int i = 0; i < nLayer; i++)
  30. printf(" ");
  31. printf("%c\n", T->data); //按逆中序输出结点,用层深决定的左、右位置
  32. printTree(T->Lchild,nLayer+1);
  33. }
  34. void printTreeNum(BiTree T, int nLayer){ //输出要求的树状编号
  35. if (T == NULL) return;
  36. printTreeNum(T->Rchild, nLayer + 1);
  37. for (int i = 0; i < nLayer; i++)
  38. printf(" ");
  39. printf("%d\n", T->num); //按逆中序输出结点,用层深决定的左、右位置
  40. printTreeNum(T->Lchild, nLayer + 1);
  41. }

 四、输出结果

                  

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

闽ICP备14008679号