二叉树 前序遍历、中序遍历和后序遍历之间还原二叉树

复制代码
 1 // 类定义代码
 2 struct TreeNode
 3 {
 4     char val;
 5     TreeNode* left;
 6     TreeNode* right;
 7     TreeNode(char x) : val(x), left(NULL), right(NULL) {}
 8  }; 
 9 int main()
10 {
11     char* pre = "ACDEBF";
12     char* vin = "DCEABF";
13     char* post = "DECFBA"; 
14     return 0;
15 } 
复制代码

1. 前序遍历和中序遍历还原二叉树

算法思想:描述如下:

  1. 根据 前序遍历 结果,第一个元素为二叉树的根节点;
  2. 观察 中序遍历 结果,根节点左侧的为左子树,若左子树根节点前(后)再无任何元素,则左(右)子树的左分支为空;根节点右侧的为右子树,若右子树根节点前(后)再无任何元素,则左(右)子树的左分支为空;
  3. 通过以上递归过程。先找到当前树的根节点,然后划分为左右子树,再进入左子树重复上面的过程,最后再进入右子树重复上面的过程,最终还原一棵树。

递归代码:

复制代码
 1 TreeNode* BinaryTreeFromOrderings(char* pre, char* vin, int length)
 2  {
 3      if( length == 0 ) return NULL;
 4 
 5      int rootIndex = 0;
 6      // 寻找当前根节点,记录子树元素个数 
 7      for(; rootIndex < length; rootIndex ++)
 8          if( vin[rootIndex] == pre[0] ) break;
 9      
10     TreeNode* tree = new TreeNode( vin[rootIndex] );
11     // 返回当前左子树 
12     tree ->left = BinaryTreeFromOrderings(pre + 1, vin, rootIndex );
13     // 返回当前右子树 
14     tree ->right = BinaryTreeFromOrderings(pre + rootIndex + 1, vin + rootIndex + 1, length - (rootIndex + 1));
15     
16     return tree;
17  }
复制代码

2. 中序遍历和后序遍历还原二叉树

算法思想:描述如下:

  1. 根据后序遍历结果,最后一个元素为二叉树的根节点;
  2. 观察中序遍历结果,其中根节点左侧为左子树,若左子树根节点前(后)再无任何元素,则左(右)子树的左分支为空;其中根节点右侧为右子树,若右子树根节点前(后)再无任何元素,则左(右)子树的左分支为空;
  3. 上面描述的过程是递归的。现根据后续遍历结果找根节点,根节点左侧为左子树,右侧为右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。

递归代码:

复制代码
TreeNode* BinaryTreeFromPostings(char* vin, char* post, int length)
 {
     if( length == 0 ) return NULL;

     int rootIndex = 0;
     // 寻找当前根节点,记录子树元素个数 
     for(; rootIndex < length; rootIndex ++)
         if( vin[rootIndex] == post[length - 1]) break;
     
    TreeNode* tree = new TreeNode( vin[rootIndex] );
    // 返回当前右子树 
    tree ->right = BinaryTreeFromPostings(vin + rootIndex + 1, post + rootIndex, length - (rootIndex + 1) );
    // 返回当前左子树 
    tree ->left = BinaryTreeFromPostings(vin, post, rootIndex );
    
    return tree;
 }
复制代码

3. 前序遍历和后序遍历还原二叉树

  已知前序和中序,后序和中序遍历序列之后,可以唯一确定一棵二叉树。但是,只知道前序和后序遍历序列,是无法分辨哪个结点是左子树或右子树。

posted @   John_yan15  阅读(1182)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示