根据前序+中序遍历序列构建二叉树

已知前序遍历序列和中序遍历序列,还原二叉树,以数组形式打印。

分析:前序遍历序列的第一个节点为二叉树的根节点,找出该节点的值在中序遍历序列中对应的位置,将中序序列分为左子树和右子树,依次细分下去,直至序列为空。采用递归法。

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;
   }
};
发布了22 篇原创文章 · 获赞 1 · 访问量 342

猜你喜欢

转载自blog.csdn.net/weixin_43086349/article/details/104671505