根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
思路
递归。
构造树题的递归通常都不太好想,对照着例子尝试分析几个例子帮助思考。
本题是前序+中序,构造树。
前序规律:第一个值就是root;
中序规律:root前面的值都来自左子树,后面的值都来自右子树。
根据上面两个规律,可以得到找到左右子树的递归方式,每次不断构造root,向上返回root,则能得到整棵树。
/**
* 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()==0 || inorder.size()==0 || preorder.size()!=inorder.size()) return nullptr;
return getChild(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);
}
TreeNode* getChild(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir){
int rval = preorder[pl];
TreeNode* root = new TreeNode(rval);
int lnum = 0;
while(inorder[il+lnum]!=rval){
++lnum;
}
TreeNode* lchild = lnum>0? getChild(preorder, inorder, pl+1, pl+lnum, il, il+lnum-1): nullptr;
TreeNode* rchild = il+lnum<ir? getChild(preorder, inorder, pl+lnum+1, pr, il+lnum+1, ir): nullptr;
root->left = lchild;
root->right = rchild;
return root;
}
};