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
Construct Binary Tree from Preorder and Inorder Traversal:
用preorder和inorder來重建binary tree
preorder(前序) : 中 -> 左 -> 右
inorder(中序) : 左 -> 中 -> 右
Python
遞歸法
class Solution:
def buildTree(self, preorder: 'List[int]', inorder: 'List[int]') -> TreeNode:
if not preorder : return None
root=TreeNode(preorder[0]) #根節點
index=inorder.index(preorder[0])
root.left=self.buildTree(preorder[1:index+1],inoreder[:index]) #左節點
root.right = self.buildTree(preorder[index + 1 :],inorder[index+1 :]) #右節點
return root
C++
遞歸法
對於每一次遞歸,我們都可以確定該二叉樹的根節點以及其左子樹和右子樹的preorder和inorder。在遞歸中,我們首先需要找到當前二叉樹的根節點,可以在preorder中找到。由於preorder的順序是根節點、左子樹、右子樹,因此在preorder中找到的根節點必然是當前子樹的根節點。找到了根節點之後,我們需要在inorder中確定其左子樹和右子樹。inorder的順序是左子樹、根節點、右子樹,因此我們可以根據preorder中根節點的位置,將inorder劃分為左子樹和右子樹兩個部分。接下來,我們可以遞歸構造左子樹和右子樹,並將它們作為根節點的左子樹和右子樹。在遞歸結束之後,我們就構造出了整棵二叉樹。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right) {
if (pre_left > pre_right) {
return nullptr;
}
int pre_root = pre_left;
int in_root = find(inorder.begin() + in_left, inorder.begin() + in_right, preorder[pre_root]) - inorder.begin();
int left_size = in_root - in_left;
TreeNode* root = new TreeNode(preorder[pre_root]);
root->left = build(preorder, inorder, pre_left + 1, pre_left + left_size, in_left, in_root - 1);
root->right = build(preorder, inorder, pre_left + left_size + 1, pre_right, in_root + 1, in_right);
return root;
}
};