剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
解题思路:
- 二叉树的中序排列:左结点,根节点,右结点
- 二叉树的前序遍历:根节点,左结点,右结点
- 根据前序遍历的结果,第一个结点就是整棵树的根节点,然后在中序遍历中找到根节点,就能找到其左子树和右子树,然后递归构建左子树和右子树
以题目示例为例:
- 前序遍历划分
[ 3 | 9 | 20 15 7 ]- 中序遍历划分
[ 9 | 3 | 15 20 7 ]
| 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) {
int n = inorder.size();
for(int i = 0; i < n; i++) mp[inorder[i]] = i;
return help(preorder,0,0,n - 1);
}
private:
unordered_map<int,int> mp;
TreeNode* help(vector<int>& pre,int root,int inL,int inR){
if(inL > inR) return NULL;
int idx = mp[pre[root]]; //找到根节点在中序遍历中的位置
TreeNode* tree = new TreeNode(pre[root]); //建立根节点
tree -> left = help(pre,root + 1,inL,idx - 1);
tree -> right = help(pre,root + (idx - inL + 1),idx + 1,inR); //idx - inL 是左子树的个数
return tree;
}
};
| Python版本 |
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
dic = {val : i for i,val in enumerate(inorder)}
def help(root,inL,inR):
if inL > inR:
return None
idx = dic[preorder[root]]
node = TreeNode(preorder[root])
node.left = help(root + 1,inL,idx - 1)
node.right = help(root + (idx - inL + 1),idx + 1,inR)
return node
return help(0,0,len(inorder) - 1)
146

被折叠的 条评论
为什么被折叠?



