• 将按顺序表存储的数组转化为链式二叉树并且按照先序、中序、后序排列分别输出


    提示:侵权请联系作者删除


    前言

    提示:这里可以添加本文要记录的大概内容:

    在学习二叉树的时候,将按顺序表存储的数组转化为链式二叉树并且按照先序、中序、后序排列分别输出的学习重点知识,是我们要始终注意进行练习的


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、实现按顺序表存储的数组转化为链式二叉树

    首先我们在这里的数组是按照二叉树的层序排列的方式进行的,层序排列是什么意思呢?

    例如在这里先给定一个数组,里面数字的排列是按照二叉树的层序排列进行的,那么按这种方式存放的数组,在转化为二叉树的时候,就可以转化为

     那么这个时候一个树的根结点和左子节点、右字子节点有什么关系呢?

    他们的关系如下:

     

     所以在这里就可以用递归的方式:

    1. struct BiNode {
    2. char data;
    3. BiNode* lchild, * rchild;
    4. }; //定义二叉树
    5. BiNode* BiTree;
    6. BiNode* CreateBiTree(char* c, int i, int n)
    7. {
    8. if ((i > n) || i == '0')
    9. return NULL;
    10. BiNode* T;
    11. T = new BiNode;
    12. T->data = c[i];
    13. T->lchild = CreateBiTree(c, 2 * i, n);
    14. T->rchild = CreateBiTree(c, 2 * i+1, n);
    15. return T;
    16. }
    17. //在这个函数当中我们是先从数组的第一个元素开始遍历,然后不断使用递归

    二、先序排列

    按照上面的思想,那么先序排列就是可以使用递归方法,先返回根结点,再返回左子节点,最后再返回右节点,代码如下:

    1. //(先根遍历) 根 左子树 右子树
    2. void PrevOrderTraverse(BiNode* T)
    3. {
    4. if (T!=NULL) {
    5. if (T->data!= '0') {
    6. cout << T->data;
    7. }
    8. PrevOrderTraverse(T->lchild);
    9. PrevOrderTraverse(T->rchild);
    10. }
    11. }

    三.中序排列

    按照上面的思想,那么先序排列就是可以使用递归方法,先返回左子结点,再返回根结点,最后再返回右节点,代码如下:

    1. //中序遍历
    2. void InOrderTraverse(BiNode* T)
    3. {
    4. if (T!=NULL) {
    5. InOrderTraverse(T->lchild);
    6. if (T->data!= '0') {
    7. cout << T->data;
    8. }
    9. InOrderTraverse(T->rchild);
    10. }
    11. }

    四、后序排列

    按照上面的思想,那么先序排列就是可以使用递归方法,先返回左子结点,再返回右子结点,最后再返回根节点,代码如下:

    1. //后序遍历
    2. void PostOrderTraverse(BiNode* T)
    3. {
    4. if (T!=NULL) {
    5. PostOrderTraverse(T->lchild);
    6. PostOrderTraverse(T->rchild);
    7. if (T->data!= '0') {
    8. cout << T->data;
    9. }
    10. }
    11. }

    五、最终代码

    从数组的输入创建,到输出二叉树的先序排列、中序排列、后序排列

    1. #include<iostream>
    2. using namespace std;
    3. struct BiNode {
    4. char data;
    5. BiNode* lchild, * rchild;
    6. };
    7. BiNode* BiTree;
    8. BiNode* CreateBiTree(char* c, int i, int n)
    9. {
    10. if ((i > n) || i == '0')
    11. return NULL;
    12. BiNode* T;
    13. T = new BiNode;
    14. T->data = c[i];
    15. T->lchild = CreateBiTree(c, 2 * i, n);
    16. T->rchild = CreateBiTree(c, 2 * i+1, n);
    17. return T;
    18. }
    19. //(先根遍历) 根 左子树 右子树
    20. void PrevOrderTraverse(BiNode* T)
    21. {
    22. if (T!=NULL) {
    23. cout << T->data;
    24. PrevOrderTraverse(T->lchild);
    25. PrevOrderTraverse(T->rchild);
    26. }
    27. }
    28. //中序遍历
    29. void InOrderTraverse(BiNode* T)
    30. {
    31. if (T!=NULL) {
    32. PrevOrderTraverse(T->lchild);
    33. cout << T->data;
    34. PrevOrderTraverse(T->rchild);
    35. }
    36. }
    37. //后序遍历
    38. void PostOrderTraverse(BiNode* T)
    39. {
    40. if (T!=NULL) {
    41. PrevOrderTraverse(T->lchild);
    42. PrevOrderTraverse(T->rchild);
    43. cout << T->data;
    44. }
    45. }
    46. int main() {
    47. int i, SampleNum;
    48. char c[100];
    49. cin >> SampleNum; //在这里指的是输入二叉树结点个数
    50. for (i = 1; i <=SampleNum; i++) {
    51. cin >> c[i];
    52. }
    53. BiTree = CreateBiTree(c, 1, SampleNum);
    54. PrevOrderTraverse(BiTree);
    55. cout << endl;
    56. InOrderTraverse(BiTree);
    57. cout << endl;
    58. PostOrderTraverse(BiTree);
    59. cout << endl;
    60. return 0;
    61. }

  • 相关阅读:
    Zookeeper集群写操作的具体流程和数据同步
    TiDB Dashboard 常见问题
    c++面试题汇总(不定期更新...)
    【C语言】结构体内存对齐机制详解
    【详细图文】Windows下安装RustRover和配置Rust环境
    Linux(Ubuntu)安装JDK环境
    Java+SpringBoot+Vue+MySQL:美食推荐系统的技术革新
    如何保障需求质量(下):你应该做到的
    Android Studio实现内容丰富的安卓校园超市
    Spring Boot Admin -Actuator 图形化管理工具
  • 原文地址:https://blog.csdn.net/m0_68997646/article/details/127801209