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


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


    前言

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

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


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

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

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

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

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

    他们的关系如下:

     

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

    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. }

  • 相关阅读:
    java计算机毕业设计家乡旅游文化推广网站MyBatis+系统+LW文档+源码+调试部署
    生活常用类API推荐
    (学习力+思考力) x 行动力,技术人成长的飞轮效应总结
    专题一matlab基础知识
    阿里云k8s环境下,因slb限额导致的发布事故
    自学Python 51 多线程开发(一)threading模块
    国民技术N32G45x双ADC规则同步模式配置
    102.二叉树的层序遍历
    操作教程|如何将DataEase开源工具嵌入第三方系统?
    vue的常用指令
  • 原文地址:https://blog.csdn.net/m0_68997646/article/details/127801209