LintCode(72)中序遍历和后序遍历树构造二叉树
2016-06-15 20:46
387 查看
题目
中序遍历和后序遍历树构造二叉树
根据中序遍历和后序遍历树构造二叉树样例
给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]
返回如下的树:
2
/ \
1 3
分析
递归解决。Python代码
""" Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None """ def buildSubTree(inorder, inBeg, inEnd, postorder, postBeg, postEnd): inLen = len(inorder) postLen = len(postorder) if inBeg == inEnd or inEnd > inLen or postBeg == postEnd or postEnd > postLen: return None root = TreeNode(postorder[postEnd - 1]) pos = inorder.index(root.val) leftLen = pos - inBeg - 1 root.left = buildSubTree(inorder, inBeg, inBeg + leftLen + 1, postorder, postBeg, postBeg + leftLen + 1) root.right = buildSubTree(inorder, inBeg + leftLen + 2, inEnd, postorder, postBeg + leftLen + 1, postEnd - 1) return root class Solution: """ @param inorder : A list of integers that inorder traversal of a tree @param postorder : A list of integers that postorder traversal of a tree @return : Root of a tree """ def buildTree(self, inorder, postorder): # write your code here return buildSubTree(inorder, 0, len(inorder), postorder, 0, len(postorder))
GitHub -- Python源码
C++代码
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { /** *@param inorder : A list of integers that inorder traversal of a tree *@param postorder : A list of integers that postorder traversal of a tree *@return : Root of a tree */ public: TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { // write your code here return buildSubTree(inorder.begin(),inorder.end(),postorder.begin(),postorder.end()); } TreeNode *buildSubTree(vector<int>::iterator inBeg, vector<int>::iterator inEnd, vector<int>::iterator postBeg, vector<int>::iterator postEnd) { if(inBeg == inEnd || postBeg == postEnd) { return NULL; }//if TreeNode *root = new TreeNode(*(postEnd - 1)); vector<int>::iterator pos = find(inBeg, inEnd, root->val); if(pos != inEnd) { int leftLen = pos - inBeg - 1; root->left = buildSubTree(inBeg,inBeg+leftLen+1, postBeg,postBeg+leftLen+1); root->right = buildSubTree(inBeg+leftLen+2,inEnd, postBeg+leftLen+1, postEnd -1 ); }//if return root; } };
GitHub -- C++源码
相关文章推荐
- Java关键字final、static使用总结
- Lombok学习
- zencart 安装和配置修改笔记
- C#重写Equals()
- HDU 2952 Counting Sheep 深搜
- 指针
- ORA-01652 无法通过128 (在表空间 TEMP中)扩展temp段 剖析解决
- 一次Ajax报错:“存储空间不足,无法完成此操作”的解决经验
- C语言运算符和操作符
- 最长k可重区间集问题(最小费用流)
- 欢迎使用CSDN-markdown编辑器
- 网站报502、504错误---lnmp
- mac安装IDEA
- web magic
- 如何提交表单
- 深入理解Android的startservice和bindservice
- 2>&1 的用法说明。
- 我的第一个Android程序--HelloWorld
- 高可用集群HA之双机集群
- Hi3515 UART2和UART3驱动加载