73. 前序遍历和中序遍历树构造二叉树
根据前序遍历和中序遍历树构造二叉树.
样例
给出中序遍历:[1,2,3]
和前序遍历:[2,1,3]
. 返回如下的树:
2
/ \
1 3
注意事项
你可以假设树中不存在相同数值的节点
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param inorder: A list of integers that inorder traversal of a tree
* @param postorder: A list of integers that postorder traversal of a tree
* @return: Root of a tree
*/
TreeNode * buildTree(vector<int> &preorder, vector<int> &inorder) {
// write your code here
if(preorder.size()<1 || inorder.size()<1 || preorder.size()!=inorder.size()) return NULL;
TreeNode* root=new TreeNode(preorder[0]);
int mid=preorder[0];
int pos=0;
for(int i=0;i<inorder.size();i++)
{
if(mid==inorder[i])
{
pos=i;
break;
}
}
vector<int> preo,prei;
vector<int> ino,ini;
for(int i=1;i<=pos;i++)
{
preo.push_back(preorder[i]);
}
for(int i=pos+1;i<preorder.size();i++)
{
prei.push_back(preorder[i]);
}
for(int i=0;i<pos;i++)
{
ino.push_back(inorder[i]);
}
for(int i=pos+1;i<inorder.size();i++)
{
ini.push_back(inorder[i]);
}
root->left=buildTree(preo,ino);
root->right=buildTree(prei,ini);
return root;
}
};
///
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""
class Solution:
"""
@param inorder: A list of integers that inorder traversal of a tree
@param postorder: A list of integers that postorder traversal of a tree
@return: Root of a tree
"""
def buildTree(self, preorder, inorder):
# write your code here
if len(preorder)<1 or len(inorder)<1 or len(preorder)!=len(inorder):
return None
mid=preorder[0]
pos=0
for i in range(len(inorder)):
if mid==inorder[i]:
pos=i;
break;
prep=preorder[1:pos+1:1]
prei=preorder[pos+1::]
inp=inorder[:pos:]
ini=inorder[pos+1::]
root=TreeNode(mid)
root.left=self.buildTree(prep,inp)
root.right=self.buildTree(prei,ini)
return root