Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:
题目理解:
考研常考题型,已知前序和中序遍历,构建二叉树。我们知道前序遍历中第一个节点一定是根节点,而根据根结点我们可以将中序遍历分为左右两个部分,左边部分就是二叉树的左子树节点,右边部分则是二叉树的右子树节点。依据这个思想,我们可以得到以下代码:
/**
* 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) {
return helper(0, 0, inorder.size()-1, preorder, inorder);
}
TreeNode *helper(int preStart, int inStart, int inEnd, vector<int>& preorder, vector<int>& inorder){
if(inStart> inEnd)
return NULL;
TreeNode *root = new TreeNode(preorder[preStart]);
int inindex = 0; //寻找中序遍历中的根节点的位置
// for(int i=inStart;i<= inEnd;i++){
for (int i = 0; i < inorder.size(); i++) {
if(inorder[i] == root->val){
inindex =i;
break;
}
}
root -> left = helper(preStart+1, inStart, inindex-1,preorder, inorder);
root -> right = helper(preStart+ inindex-inStart+1, inindex+1, inEnd, preorder, inorder);
return root;
}
};