题目:给定一棵树的前序遍历 preorder
与中序遍历 inorder
。请构造二叉树并返回其根节点。
分析:
下面为解题代码:
class Solution {
public:
TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder, int& prei,int inbegin,int inend)
{
if(inbegin > inend )
return NULL;
TreeNode* root = new TreeNode(preorder[prei]);
//找到根的位置
int rooti = inbegin;
while(rooti != inend)
{
if(preorder[prei] == inorder[rooti])
break;
else
++rooti;
}
//[inbegin,rooti-1] 左子树 [rooti+1,inend]右子树
if(inbegin <= rooti-1)//如果存在左子树
root->left = _buildTree(preorder,inorder,++prei,inbegin,rooti-1);
else
root->left = NULL;//如果没有左子树
if(rooti+1 <= inend)//如果存在右子树
root->right = _buildTree(preorder,inorder,++prei,rooti+1,inend);
else
root->right =NULL;//如果没有右子树
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int prei = 0;
int inbegin = 0;
int inend = inorder.size()-1;
return _buildTree(preorder,inorder,prei,inbegin,inend);
}
};