Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
You may assume that duplicates do not exist in the tree.
Analysis:
The idea is similar to the previous question. Just be careful with the order of dividing the vector, and the order of preorder root.
Code(C++):
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int findId(int n, vector<int> &inorder){
for (int i=0;i<inorder.size();i++){
if (inorder[i] == n) return i;
}
}
TreeNode* bst(vector<int> &preorder, int &mid, vector<int> &inorder, int st, int ed){
if (st>ed || preorder.size()==mid){
return NULL;
}
TreeNode* root = new TreeNode(preorder[mid]);
int idx = findId(preorder[mid], inorder);
mid++;
root->left = bst(preorder, mid, inorder, st, idx-1);
root->right = bst(preorder, mid, inorder, idx+1, ed);
return root;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int mid = 0;
return bst(preorder, mid, inorder, 0, inorder.size());
}
};
Code(Python):
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# @param preorder, a list of integers
# @param inorder, a list of integers
# @return a tree node
def bst(self, preorder, inorder):
if len(preorder) == 0 or len(inorder) == 0:
return None
root = TreeNode(preorder[0])
idx = inorder.index(preorder[0])
preorder.pop(0)
root.left = self.bst(preorder, inorder[0:idx])
root.right = self.bst(preorder, inorder[idx+1:])
return root
def buildTree(self, preorder, inorder):
return self.bst(preorder, inorder)
No comments:
Post a Comment