剑指 Offer 07. 重建二叉树

class Solution {

    /**

     * @param Integer[] $preorder

     * @param Integer[] $inorder

     * @return TreeNode

     *前序遍历 第一个是根节点,在中序数组中找到根节点,则中序数组中左边的是左子树的元素,右边是右子树的元素

     *然后根据左右子树的元素个数也可以将前序数组分为左右子树的前序数组,以此类推。则可以用递归来实现。

     */

    function buildTree($preorder, $inorder) {

        if(empty($inorder)){

            return null;

        }

        $root = array_shift($preorder);

        $qf = array_search($root,$inorder);

        $left_inorder = array_slice($inorder,0,$qf);

        $right_inorder = array_slice($inorder,$qf+1);

        $left_preorder = array_slice($preorder,0,count($left_inorder));

        $right_preorder = array_slice($preorder,count($left_inorder));

        $left = $this->buildTree($left_preorder,$left_inorder);

        $right = $this->buildTree($right_preorder,$right_inorder);

        $root = new TreeNode($root);

        $root->left = $left;

        $root->right = $right;

        return $root;

    }

}

你可能感兴趣的:(剑指 Offer 07. 重建二叉树)