博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树还原【前序+中序】【后续+中序】
阅读量:6072 次
发布时间:2019-06-20

本文共 2604 字,大约阅读时间需要 8 分钟。

已知二叉树的中序加前序或后续可以还原出二叉树(:中序是必须知道的)

  • 前序:a b c
  • 中序:b a c
  • 后续:b c a

1. 前序 + 中序

思路

对于例图中,由前序可知,第一个元素即a是根节点,从对应的中序中找到a。从而进一步知道其左边的b在左树中,其右边的c在右树中,这样结合前序递归可以还原出整个树。

参考代码

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* getTree(vector
&preorder, vector
&inorder, int prebeg, int preend, int inbeg, int inend) { if(prebeg < preend && inbeg < inend) { TreeNode *rev = new TreeNode(preorder[prebeg]); vector
::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, preorder[prebeg]); int span = mid - (inorder.begin() + inbeg); rev->left = getTree(preorder, inorder, prebeg+1, prebeg+1+span, inbeg, inbeg+span); rev->right = getTree(preorder, inorder, prebeg+1+span, preend, inbeg+span+1, inend); return rev; } return NULL; } TreeNode *buildTree(vector
&preorder, vector
&inorder) { return getTree(preorder, inorder, 0, preorder.size(), 0, inorder.size()); }};

 

2. 后序 + 中序

思路

对于例图中,由后序可知,最后一个元素即a是根节点,从对应的中序中找到a。从而进一步知道其左边的b在左树中,其右边的c在右树中,这样结合前序递归可以还原出整个树。

参考代码

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode *getTree(vector
&inorder, vector
&postorder, int inbeg, int inend, int postbeg, int postend) { if (inbeg < inend && postbeg < postend) { TreeNode *rev =new TreeNode(postorder[postend-1]); vector
::iterator mid = find(inorder.begin()+inbeg, inorder.begin()+inend, postorder[postend-1]); int span = mid - (inorder.begin() + inbeg); rev->left = getTree(inorder, postorder, inbeg, inbeg+span, postbeg, postbeg+span); rev->right = getTree(inorder, postorder, inbeg+span+1, inend, postbeg+span, postend-1); return rev; } return NULL; } TreeNode *buildTree(vector
&inorder, vector
&postorder) { return getTree(inorder, postorder, 0, inorder.size(), 0, postorder.size()); }};

 

3. 细节

利用vector引用的方式,可以避免每次复制导致空间利用过大,利用引用直接在原始空间内进行操作。

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3788533.html,如需转载请自行联系原作者

你可能感兴趣的文章
在Delphi中隐藏程序进程
查看>>
AngularJS PhoneCat代码分析
查看>>
maven错误解决:编码GBK的不可映射字符
查看>>
2016/4/19 反射
查看>>
SharePoint Wiki发布页面的“保存冲突”
查看>>
oracle 10g 数据库与客户端冲突导致实例创建无监听问题
查看>>
Delphi中读取文本文件的方法(实例一)
查看>>
Linux常用命令
查看>>
Android开源代码解读の使用TelephonyManager获取移动网络信息
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VS2008查看dll导出函数
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>
iOS - Library 库
查看>>
MATLAB 读取DICOM格式文件
查看>>
spring事务管理(Transaction)
查看>>