剑指offer-重建二叉树-php

    xiaoxiao2021-03-25  102

    题目

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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; }
    转载请注明原文地址: https://ju.6miu.com/read-7616.html

    最新回复(0)