题目一:inorder & postorder--->binary tree
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
思路
通过中序和后序遍历的结果重建二叉树
主要是确定 中序遍历 和后序遍历的对应范围。
首先将 后序遍历的 最后一个元素作为根,然后将中序遍历序列根据此根分成左右两部分,
同时后序遍历的左右分割可以根据中序遍历序列左右部分的节点个数来确定边界。
/**
* 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 *buildTree(vector<int> &inorder, vector<int> &postorder) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(inorder.size()==0 || postorder.size()==0)
return NULL;
return mybuildTree(inorder, postorder, 0,inorder.size()-1,0,postorder.size()-1);
}
TreeNode *mybuildTree(vector<int> &inorder, vector<int> &postorder, int is, int ie, int ps, int pe) {
if(is>ie) return NULL;
if(ps>pe) return NULL;
int k=is;
while(inorder[k]!=postorder[pe]) k++;
TreeNode *node = new TreeNode(postorder[pe]);
node->left = mybuildTree(inorder, postorder, is, k-1, ps, ps+k-1-is);
node->right = mybuildTree(inorder, postorder, k+1, ie, pe-1-ie+(k+1), pe-1);
return node ;
}
};
题目二:preorder & inorder--->binary tree
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
思路
/**
* 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 *buildTree(vector<int> &preorder, vector<int> &inorder) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(preorder.size()==0 || inorder.size()==0)
return NULL;
return mybuildTree(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);
}
TreeNode *mybuildTree(vector<int> &preorder, vector<int> &inorder, int ps, int pe, int is, int ie) {
if(ps>pe) return NULL;
if(is>ie) return NULL;
int k=is;
while(inorder[k]!=preorder[ps]) k++;
TreeNode *node = new TreeNode(preorder[ps]);
node->left = mybuildTree(preorder, inorder, ps+1, ps+1+k-1-is , is, k-1);
node->right = mybuildTree(preorder, inorder, pe-(ie-k-1), pe, k+1, ie);
return node;
}
};