• 恢复二叉树思路及代码


    • 思想:

            以下图二叉树为例进行思路演示

            先序:(根、左、右)a b d e c f g

            中序:(左、根、右)d b e a f c g

            后序:(左、右、根)d e b f g c a

    •         先序+中序恢复

                            1)前序第一个为根a,找中序内和先序第一个相等的根位置

                            

                             2)中序遍历将左右子树隔开,左子树个数为3。先序遍历中,从根a后面找3个

                             3)递归划分左子树: 先序遍历可知b是左子树的根,从中序遍历中找到根b,b左边是左子树,右边是右子树

                            重复3)步骤,找到右子树的根c,在中序遍历中将c的左子树f,右子树g找到。

    •         中序+后序恢复

                            1)后序中最后一个字符a为根,在中序中找到根a的位置

                             2)在中序中根a的左边为左子树,右边为右子树

                            3) 再从后序中找到左子树根b,右子树的根c,然后在中序中根左边为左子树,右边为右子树。递归重复进行查找。

    • 代码:
    1. typedef struct node
    2. {
    3. char value;//当前节点值
    4. struct node* left;//指向当前节点左孩子指针
    5. struct node* right;//指向当前节点右孩子指针
    6. }Node;
    7. typedef struct tree
    8. {
    9. Node* root;
    10. }Tree;
    11. void InitTree(Tree* t)
    12. {
    13. t->root = NULL;
    14. }
    15. //用先序字符串和中序字符串恢复二叉树
    16. Node* Create(const char* vlr,const char* lvr,int n)
    17. {//函数参数:vlr: 先序遍历,lvr: 中序遍历n: 当前字符串个数
    18. //字符串遍历完毕,即为到达叶子节点,无左右子树
    19. if (n == 0)
    20. return NULL;
    21. //还有字符串
    22. else
    23. {
    24. int k = 0;
    25. while (vlr[0] != lvr[k])
    26. {
    27. k++;
    28. }
    29. Node* root = (Node*)malloc(sizeof(Node));
    30. root->value = vlr[0];
    31. //左子树
    32. root->left = Create(vlr + 1, lvr, k);
    33. //右子树
    34. root->right = Create(vlr + 1+k, lvr+k+1, n-k-1);
    35. return root;
    36. }
    37. }
    38. //后序
    39. void PostOrder(node* root)
    40. {
    41. if (root != NULL)
    42. {
    43. PostOrder(root->left);
    44. PostOrder(root->right);
    45. printf("%c", root->value);
    46. }
    47. }
    48. int main()
    49. {
    50. const char* vlr = "abdecfg";//先序
    51. const char* lvr = "dbeafcg";//中序
    52. Tree t;
    53. InitTree(&t);
    54. int n = strlen(vlr);
    55. t.root = Create(vlr, lvr, n);
    56. PostOrder(t.root);//后序遍历输出验证一下
    57. printf("\n");
    58. }

    点击此处参考后序遍历代码

    • 运行结果:

  • 相关阅读:
    centos7环境下安装jdk8
    Postman核心功能解析 —— 参数化和测试报告
    如何使用ChatGPT创建一份优质简历
    2020中青杯A题集成电路通道布线数学建模全过程论文及程序
    PHP页面之间传递参数的三种方法
    ASCII_Util.java
    亚马逊鲲鹏系统一款可以帮助AMZ商品加购系统
    priority_queue 模拟实现
    javaweb高校物资采购进销存管理系统ssm框架
    java(ArrayList、Vector、LinkedList底层结构和源码分析)
  • 原文地址:https://blog.csdn.net/qq_53830608/article/details/126244896