题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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;
}