重建二叉数【剑指offer】

题目描述

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

题目链接:重建二叉树

二叉树四种基本的遍历思想为:
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
层次遍历:仅仅需按层次遍历就可以

解题思路:

1.前序遍历的第一个节点是根节点;

2.在中序遍历中找到根节点的位置x,x左边的是左子树,x右边的是右子树;

3.前序遍历的第二个节点是是左子树的根节点(如果左子树存在的话),再重复第二步骤,又可以划分左右子树;

<?php

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

function build($preList, $midList, $pstart, $pend, $mstart, $mend) {
    if($pstart>$pend || $mstart>$mend) return ;
    $root = $preList[$pstart]; //前序遍历的第一个节点
    for($find = $mstart; $find<=$mend; $find++){
        if($root == $midList[$find]) {
           break;  
         }
    } //中序遍历寻找根节点,分割左右子树
    $len = $find - $mstart; //左子树的长度
    $tree = new TreeNode($midList[$find]);
    $tree->left = build($preList, $midList, $pstart+1, $pstart+$len, $mstart, $find-1);
    $tree->right = build($preList, $midList, $pstart+$len+1, $pend, $find+1, $mend);
    return $tree;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值