二叉树--由前序遍历和中序遍历重建二叉树

由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)

思路:
前序遍历第一个是根节点。
中序遍历根节点左侧为左子树,根右侧为右子树。
那么先构造根节点,根节点左侧都为左子树,根右侧都为右子树。
然后对左右子树递归式的构造即可。

//封装
BinaryTreeNode* Construct(int * preorder, int* inorder,int length)
{
     if(preorder == NULL || inorder == NULL || length <= 0)
          return NULL;
     return ConstructCore(perorder, preorder+length-1,inorder,inorder+length-1);
}

//找根并递归构建
BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
     int rootValue = startPreorder[0];
     BinaryTreeNode* Root = new BinaryTreeNode();
     Root -> value = rootvalue;
     Root -> left = Root -> right = NULL;

     if(startPreorder == endPreorder)
     {
          if(startInorder == endInorder && *startPreorder = *startInorder)
               return Root;
          else
               cout<<"error input"<<endl;
               return NULL;
     }

     //中序遍历找根
     int *rootInorder = startInorder;
     while(rootInorder <= endInorder && *rootInorder != rootValue)
          ++rootInorder;

     if(rootInorder > endInorder)
          return NULL;

     int leftLength = rootInorder - startInorder;
     int * leftPreOrderEnd = startPreorder+leftLength;

     //递归构建左右子树
     if(leftLength > 0)
          Root -> left = ConstructCore(startPreorder+1,leftPreOrderEnd,startInorder,rootInorder-1);
     if(leftLength < endPreorder - startPreorder)
          Root -> right = ConstructCore(leftPreOrderEnd+1,endPreorder,rootInorder+1,endInorder-1);

      return Root;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值