重建二叉树
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
思路:
递归建树,找到根节点在中序中的位置然后递归建立左右子树
build中的root、start、end都是在先序中的位置,比如先序根节点后的第一个节点就是左子树的根节点。
总结:
注意python和C++在新建对象时的不同,C++需要new,python则是用()。
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) {
return build(preorder, inorder, 0, 0, inorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int root, int start, int end){ // 前序的start和end
if(start > end)
return NULL;
TreeNode *tree = new TreeNode();
tree->val = preorder[root];
tree ->left=tree->right = NULL;
int i = start;
while(i < end && preorder[root] != inorder[i]) //找到中序中的根节点
++i;
tree->left = build(preorder, inorder, root + 1, start, i - 1); //root+1是先序中根节点后面的一个,即左子树的根
tree->right = build(preorder, inorder, root + 1 + i - start, i + 1, end); //root+1+i-start是先序中右子树的根
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:
def build(preorder: List[int], inorder: List[int], root: int, start: int , end :int) -> TreeNode:
if start > end:
return None
tree = TreeNode()
tree.val = preorder[root]
tree.left = None
tree.right = None
i = start
while inorder[i] != preorder[root] and i!=end:
i+=1
tree.left = build(preorder, inorder, root+1, start, i-1)
tree.right = build(preorder, inorder, root+1+i-start, i+1 , end)
return tree
return build(preorder, inorder, 0, 0, len(preorder)-1)