剑指offer-重建二叉树-php

题目

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

题解

利用前序遍历和中序遍历的性质来解决这个问题。
首先前序遍历的第一个节点是树的根节点root,在中序遍历中找到这个root,则root前面就是左子树的中序遍历结果。root后面就是右子树的中序遍历。
同时根据中序遍历可得到左子树的长度。
前序遍历中的第二个节点是左子树的根节点,以此来递归调用。

代码

<?php

/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/
function reConstructBinaryTree($pre, $vin)
{
    // write code here
    return build($pre, $vin, 0, count($pre)-1, 0, count($vin)-1);
}

function build($pre, $inorder, $pstart, $pend, $istart, $iend) {
    if ($pstart > $pend||$istart>$iend)return;
    $root = $pre[$pstart];

    for($find = $istart; $find<=$iend;$find++){
         if($root === $inorder[$find]){
               break;
            }
    }

    $len = $find-$istart;//左子树长度
    $res = new TreeNode($inorder[$find]);
    $res->left = build($pre, $inorder, $pstart+1, $pstart+$len,$istart,$find-1);
    $res->right = build($pre, $inorder ,$pstart+$len+1, $pend,$find+1, count($inorder)-1);
    return $res;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值