Given two integer arrays preorder
and inorder
where preorder
is the preorder traversal of a binary tree and inorder
is the inorder traversal of the same tree, construct and return the binary tree.
Example 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
Example 2:
Input: preorder = [-1], inorder = [-1] Output: [-1]
Constraints:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
andinorder
consist of unique values.- Each value of
inorder
also appears inpreorder
. preorder
is guaranteed to be the preorder traversal of the tree.inorder
is guaranteed to be the inorder traversal of the tree.
A:
就是先通过preorder中的第一个,找到root。 然后,在inorder中找到 其对应的position, position 左边的就是左子树, 右边的就是右子树。 (相应的范围在preorder中,只需要计算左子树节点的数目,就可以确定。)
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return helper(preorder, 0, preorder.size(), inorder, 0, inorder.size());}private:TreeNode* helper(vector<int>& preorder, int lowP, int highP,vector<int>& inorder, int lowI, int highI) {if (lowI >= highI)return nullptr;TreeNode* root = new TreeNode(preorder[lowP]);int ix = lowI;for (; ix < highI; ix++)if (inorder[ix] == root->val)break;int nLeft = ix - lowI; // number of nodes in left childroot->left =helper(preorder, lowP + 1, lowP + nLeft + 1, inorder, lowI, ix);root->right =helper(preorder, lowP + nLeft + 1, highP, inorder, ix + 1, highI);return root;}};
犯的错误是: 当nLeftChild的定义搞错了,加了个1.
在计算root.left 和 root.right 的inorder指针的时候,就忘了一个是要-1 , 一个是要+1. (刚开始,自己是一个没有改,一个+2了)
Mistakes:
1: 主要就是,递归调用的时候, preOrder的low,high参数,要好好考虑。 (尤其是, preorder时, 不需要跳过一个数字的。)
No comments:
Post a Comment