重建二叉树

未匹配的标注

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例

输入:

前序遍历序列{1,2,4,7,3,5,6,8}
中序遍历序列{4,7,2,1,5,3,8,6}

输出:

aYqMDoParK.png!large

遍历概念

前序遍历:根结点 —> 左子树 —> 右子树。
中序遍历:左子树 —> 根结点 —> 右子树。
后序遍历:左子树 —> 右子树 —> 根结点。
层次遍历:只需按树的层级从上往下,从左往右遍历即可。

分析

  1. 按照前序遍历的规则,可知前序遍历序列第一个数为根节点,即 1。
  2. 按照中序遍历的规则,可知中序遍历序列中 1 的左边为左子树4,7,2,1 的右边为右子树5,3,8,6
  3. 递归左右子树,重建根节点的左右子树。

代码

<?php

/**
 *  树节点的类
 *  class TreeNode{
 *    var $val;
 *    var $left = NULL;
 *    var $right = NULL;
 *    function __construct($val){
 *        $this->val = $val;
 *    }
 *  }
 */

/**
 * 递归重建二叉树
 *
 * @param array $pre 前序遍历序列
 * @param array $vin 中序遍历序列
 */
function reConstructBinaryTree($pre, $vin)
{
    // 递归要注意出口:如果没有前、中序遍历序列,那么就不要递归。
    if($pre && $vin) {
        $root  = new TreeNode($pre[0]);       // 根节点
        $index = array_search( $pre[0],$vin); // 根节点在中序数组的位置
        $root->left = reConstructBinaryTree(array_slice($pre,1,$index),array_slice($vin,0,$index));
        $root->right = reConstructBinaryTree(array_slice($pre,$index+1),array_slice($vin,$index+1));
        return $root;
    }

    return null;
}

笔记

函数 说明
array_search(element, array) 在 array 中搜索 element,如果成功则返回首个相应的键名
array_slice(array, start, length) 在 array 中取出一段从 start 开始、长度为 length 的子数组

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~