- LeetCode #105 #106 2018-08-12
- [Leetcode]105. Construct Binary
- Leetcode - Binary Tree 二叉树 [持续更新
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from
- 105. Construct Binary Tree from

/**
* 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>& preorder, vector<int>& inorder) {
if(!preorder.size() || !inorder.size()) return NULL;
return builderHelper(preorder, 0, preorder.size(), inorder, 0, inorder.size());
}
private:
TreeNode* builderHelper(vector<int>& preorder, int pstart, int pend, vector<int> inorder, int istart, int iend){
if(pstart >= pend || istart >= iend){
return NULL;
}
int root = preorder[pstart];
auto rootInorder = find(inorder.begin() + istart, inorder.begin() + iend, root);
int length = rootInorder - (inorder.begin() + istart);
TreeNode* myroot = new TreeNode(root);
myroot->left = builderHelper(preorder, pstart + 1,pstart + 1 + length, inorder, istart, istart + length );
myroot->right = builderHelper(preorder, pstart +1 + length,pend, inorder, istart+length+1, iend );
return myroot;
}
};
一定要注意,是半开半闭区间,右边界是开的
只要写出来建左树,右边的对照着左边的坐标,即可写出

/**
* 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) {
if(!inorder.size() || !postorder.size()){
return NULL;
}
return helper(inorder, 0, inorder.size(), postorder, 0, postorder.size());
}
TreeNode* helper(vector<int>&inorder, int istart, int iend, vector<int>&postorder, int pstart, int pend){
if(istart >= iend || pstart >= pend){
return NULL;
}
int root = postorder[pend-1];
auto rootInorder = find(inorder.begin() + istart, inorder.begin() + iend, root);
int length = rootInorder - inorder.begin() - istart;
TreeNode* myroot = new TreeNode(root);
myroot->left = helper(inorder,istart, istart + length,postorder,pstart, pstart + length);
myroot->right = helper(inorder, istart+length+1, iend, postorder, pstart + length, pend - 1);
return myroot;
}
};
网友评论