Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
由前序遍历和中序遍历构建二叉树。
流程:
- 从preorder选取一个数据
- 从inorder找到这个数据的下标,并以此为界限将其分成左右孩子
- 在分左右孩子之后,获取左右孩子的数量,它们将用于限制preorder中的遍历长度
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int len1=preorder.size();
int len2=inorder.size();
if(len1<=0) return NULL;
return build(preorder,0,len1-1,inorder,0,len2-1);
}
TreeNode* build(vector<int>& preorder,int s0,int e0,
vector<int>& inorder,int start,int end
){
//下标不符合要求,说明此子树为空
if(start>end) return NULL;
if(s0>e0) return NULL;
//新生成一个节点
TreeNode* node=new TreeNode(preorder[s0]);
//判断这个节点在inorder中的下标
int i=start;
for(i=start;i<=end;i++)
if(inorder[i]==preorder[s0]) break;
//获得这个节点的下标
//从而可以确定左右子树的范围
//注意同时需要限制在preorder中的范围
if(s0<=e0){
if(i>start) node->left=build(preorder,s0+1,s0+i-start,inorder,start,i-1);
if(i<end) node->right=build(preorder,s0+i-start+1,e0,inorder,i+1,end);
}
return node;
}
};