Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

解题思路:

给出一个二叉树的中序和后序遍历结果,还原这个二叉树。

对于一个二叉树:

         1
/ \
2 3
/ \ / \
4 5 6 7

后序遍历结果为:4 5 2 6 7 3 1

中序遍历结果为:4 2 5 1 6 3 7

由此可以发现规律:

1、后序遍历的最后一个字符,就是根结点(1)

2、发现根节点后,对应在中序遍历中的位置,则在中序遍历队列中,根节点左边的元素构成根的左子树,根的右边元素构成根的右子树;

3、递归的将左右子树也按照上述规律进行构造,最终还原二叉树。

代码:

 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/ class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return buildSubtree(postorder, inorder, ,
postorder.size()-,
, inorder.size()-);
} TreeNode* buildSubtree(vector<int>& postorder, vector<int>& inorder,
int p_left, int p_right, int i_left, int i_right) {
if (p_left > p_right || i_left > i_right)
return NULL; int root = postorder[p_right];
TreeNode* node = new TreeNode(postorder[p_right]); int range = ;
for (int j = i_left; j <= i_right; ++j) {
if (root == inorder[j]) {
range = j - i_left;
break;
}
} node->left = buildSubtree(postorder, inorder,
p_left, p_left + range - ,
i_left, i_left + range - );
node->right = buildSubtree(postorder, inorder,
p_left + range, p_right - ,
i_left + range + , i_right);
return node;
}
};

最新文章

  1. iOS-数据解析XML解析的多种平台介绍
  2. SSH服务器与Android通信(3)--Android客户端发送数据
  3. Python---MySQL相关操作
  4. webpack +vue开发(1)
  5. 使用HTML5的File实现base64和图片的互转
  6. Socurce Insight 快捷键
  7. 关于Linux系统basename函数缺陷的思考
  8. Ackerman函数
  9. C#(结构体_枚举类型)
  10. NSNumber 转 NSString
  11. 使用Docker官方的Django包【转】
  12. Java程序员们最常犯的10个错误(转)
  13. js--面向对象继承
  14. Spring JDBC 示例
  15. Nginx的反向代理与负载均衡
  16. Android初级教程对大量数据的做分页处理理论知识
  17. idea工具的快捷方式
  18. notepad++ 注释
  19. [简记] github 上的 GraphQL v4 API
  20. UVA11988-Broken Keyboard(数组模拟链表)

热门文章

  1. selenium 之Ran 0 tests in 0.000s
  2. linux 内存介绍
  3. Oracle 如何修改列的数据类型
  4. dfs.replication、dfs.replication.min/max及dfs.safemode.threshold.pct
  5. Linux将MySQL数据库目录挂载至新数据盘
  6. 更好的理解MVC
  7. 设置全局theme及读取theme方法
  8. 问题集录04--json和jsonp讲解
  9. Firebird Procedure 带返回的存储过程
  10. 致命id(就是一个神经病精神分裂的故事---但讲述方式真的很不错)