题目描述:

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:

你可以假设树中没有重复的元素。

示例:

给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
/ \
9 20
/ \
15 7

解法:

# define PR pair<int, int>
/**
* 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:
int binary_search(vector<PR>& lst, int target){
int l = 0, r = lst.size() -1;
int mid = 0;
while(l <= r){
mid = l + (r-l)/2;
if(lst[mid].first < target){
l = mid + 1;
}else if(lst[mid].first == target){
return lst[mid].second;
}else{
r = mid - 1;
}
}
return -1;
} // method 3: accepted
TreeNode* buildTree(vector<int>& postorder, vector<int>& inorder, int pl, int pr, int il, int ir, vector<PR>& inlst) {
if(pl > pr){
return NULL;
}else if(pl == pr){
return new TreeNode(postorder[pr]);
}else{
TreeNode* root = new TreeNode(postorder[pr]);
int mid = binary_search(inlst, postorder[pr]);
int lsz = mid - il;
// int rsz = ir - mid;
root->left = buildTree(postorder, inorder, pl, pl + lsz-1, il, il + lsz-1, inlst);
root->right = buildTree(postorder, inorder, pl+lsz, pr-1, il + lsz+1, ir, inlst);
return root;
}
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
// method 3:
int sz = postorder.size();
int pl = 0, pr = sz-1;
int il = 0, ir = sz-1;
vector<PR> inlst;
for(int i = 0; i < sz; i++){
inlst.push_back({inorder[i], i});
}
sort(inlst.begin(), inlst.end());
return buildTree(postorder, inorder, pl, pr, il, ir, inlst);
}
};

最新文章

  1. 诡异的localhost无法连接
  2. python读取和写入csv文件
  3. 无法启动xwindow
  4. jquery CRUD一个元素class属性
  5. Java 对象内存占用
  6. Json.Net4.5 序列化问题
  7. [游戏模版8] Win32 透明贴图
  8. 【Spring】利用AOP来做系统性能监控
  9. Asp.net MVC中提交集合对象,实现Model绑定(转载)
  10. C++关键字(static-register-atuo-extern-volatile-const)
  11. 设置imageView正方形高宽
  12. poj 3270 置换
  13. 识别Andriod APK签名证书类型
  14. NLP系列(3)_用朴素贝叶斯进行文本分类(下)
  15. 【一天一道LeetCode】#30. Substring with Concatenation of All Words
  16. Shell 编程注意点
  17. xmind-postman
  18. WPF中的数据绑定(初级)
  19. StatefulSet
  20. C++ leetcode Longest Palindromic Substring

热门文章

  1. http响应chunked格式分析
  2. Python中常用模块一
  3. leetcode318
  4. EasyGui
  5. PHP下生成非重复的id
  6. easyui之datagrid之formatter(后台传递常量自动转换值)
  7. java tcp socket实例
  8. Variable hoisting Function hoisting
  9. 轻量级的同步机制——volatile语义详解(可见性保证+禁止指令重排)
  10. NOIP2012摆花