已知前序遍历序列和中序遍历序列,还原二叉树,以数组形式打印。
分析:前序遍历序列的第一个节点为二叉树的根节点,找出该节点的值在中序遍历序列中对应的位置,将中序序列分为左子树和右子树,依次细分下去,直至序列为空。采用递归法。
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution
{
public:
TreeNode* buildTree(vector<int>& preOrder,vector<int>& inOrder)
{
if(preOrder.size()==0 || inOrder.size()==0) return NULL;
return build(preOrder,0,preOrder.size()-1,inOrder,0,inOrder.size()-1);
}
TreeNode* build(vector<int>& preOrder,int a1,int a2,vector<int>& inOrder,int b1,int b2)
{
TreeNode* root=new TreeNode(preOrder[a1]);//前序遍历第一个节点为根节点
int i=b1;//b1为中序遍历的起始下标
while(inOrder[i]!=preOrder[a1]) i++;//找到根节点在中序序列中的位置
int left=i-b1;//中序遍历左半部分为左子树长度
int right=b2-i;//中序遍历右半部分为右子树长度
if(left>0) root->left=build(preOrder,a1+1,a1+left,inOrder,b1,i-1);
if(right>0) root->right=build(preOrder,a1+left+1,a2,inOrder,i+1,b2);
return root;
}
};