题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
给出:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回:
3
/
9 20
/
15 7
其实就是【3,9,20,null,null,15,7】
递归法:
记录所有节点的索引,用字典或者unordered_map存储
找到根节点-》分开左右子树-》递归遍历,返回节点
递归出口,左边界大于右边界
python版本
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self,preorder,inorder):
def recur(root,left,right):
if left>right:
node=TreeNode(preorder[root]) #选根节点
i=dic[preorder[root]]
node.left=recur(root+1,left,i-1)
node.right=recur(i-left+root+1,i+1,right)
return node
dic,preorder={},preorder
#记录所有节点的索引位置
for i in range(len(inorder)):
dic[inorder[i]]=i
return recur(0,0,len(inorder)-1)
C++版本
/**
* 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){
this->preorder=preorder;
for(int i=0;i<inorder.size();i++){
dic[inorder[i]]=i;
}
return recur(0,0,inorder.size()-1);
}
private:
vector<int> preorder;
unordered_map<int,int> dic;
TreeNode* recur(int boot,int left,int right){
if(left>right) return nullptr;
TreeNode* node=new TreeNode(preorder[root]);
int i=dic[preorder[root]];
node->left=recur(root+1,left,i-1);
node->right=recur(i-left+root+1,i+1,right);
return node;
}
};