重建二叉树

重建二叉树

      输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。

例如:前序遍历:1 2 4 7 3 5 6 8

           中序遍历:4 7 2 1 5 3 8 6

分析:前序遍历的第一个值为根节点的值,然后跟的是左子树和右子树中所有的节点

           中序遍历中前一部分是左子树节点,中间是根节点,后面一部分是右子树节点。

如例题中给出的遍历结果,第一次可以划定:

前序遍历:1 2 4 7 3 5 6 8                                   中序遍历:4 7 2 1 5 3 8 6

                                                                                                                  

第二次划分:

前序遍历:2 4 7 3 5 6 8                                   中序遍历:4 7 2 1 5 3 8 6

                                                  左根左右                                                        左根右

第三次划分:

前序遍历:1 2 4 7 3 5 6 8                                   中序遍历:4 7 2 1 5 3 8 6

                                                  根右  根左                                                     根右         左根

由此可以看出,这是一个递归的过程。具体程序如下:

 

void CreateTree(Node *root, int bstart, int bend,int mstart, int mend, int *before, int *mid, int len)

{

         if (root == NULL)

                   return;

 

         if ( bstart > bend )

                   return;

 

         if ( mstart > mend )

                   return;

 

         //前序遍历的第一个值为根节点的值

         root->value = before[bstart];

 

         //在中序遍历中找出该值所在的位置

         int temp;                    //记下该值的位置

         int count =0;              //记下该左子树中有多少个节点

         for ( int i=mstart; i<= mend; i++)

         {

                   if ( mid[i] == root->value )

                   {

                            temp = i;

                            break;

                  }

                   count++;

         }

 

         //进行递归,建立左子树和右子树,注意子树为空的情况

         if ( count == 0 )

                   root->left = NULL;

         else

         {

                   Node *left = new Node;

                   root->left = left;

                   CreateTree(left, bstart+1, bstart+count, mstart, temp-1, before, mid, len);

         }

 

         if ( temp == mend)

                   root->right = NULL;

         else          

         {

                   Node *right = new Node;

                   root->right = right;

                   CreateTree(right, bstart+count+1,bend,temp+1,mend,before, mid, len);

         }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值