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

1.前序遍历是中,左,右;中序遍历是左,中,右
2.前序遍历的第一个是根结点,中序遍历数组中从开始到根结点的所有是左子树,可以知道左子树的个数,根结点右边的是右子树
3.前序遍历除去0位置的,从1到左子树个数位置是左子树,其他的是右子树
4.确定四个数组,前序左子树数组,前序右子树数组,中序左子树数组,中序右子树数组;递归调用 reConstructBinaryTree(pre,in)
if(pre.length) return null//递归终止条件
root=pre[0]
Node=new Node(root)
//在中序中找根结点的位置
p=0
for p;p<pre.length;p++
if in[p]==root break
for i=0;i<pre.length;i++ if i<p
//中序左子树数组
inLeft[]=in[i]
//前序左子树数组
preLeft[]=pre[i+1]
else if i>p
//中序的右子树
inRight[]=in[i]
//前序的右子树
preRight[]=pre[i]
Node->left=reConstructBinaryTree(preLeft,inLeft)
Node->right=reConstructBinaryTree(preRight,inRight)
return Node
<?php
class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
};
function reConstructBinaryTree($pre, $vin){
$len=count($pre);
if($len==0){
return null;
}
$root=$pre[0];
$node=new TreeNode($root);
for($p=0;$p<$len;$p++){
if($vin[$p]==$root){
break;
}
}
$preLeft=array();
$preRight=array();
$vinLeft=array();
$vinRight=array();
for($i=0;$i<$len;$i++){
if($i<$p){
$preLeft[]=$pre[$i+1];
$vinLeft[]=$vin[$i];
}else if($i>$p){
$preRight[]=$pre[$i];
$vinRight[]=$vin[$i];
}
}
$node->left=reConstructBinaryTree($preLeft,$vinLeft);
$node->right=reConstructBinaryTree($preRight,$vinRight);
return $node;
} $pre=array(1,2,4,7,3,5,6,8);
$vin=array(4,7,2,1,5,3,8,6);
$node=reConstructBinaryTree($pre,$vin);;
var_dump($node);
object(TreeNode)#1 (3) {
["val"]=>
int(1)
["left"]=>
object(TreeNode)#2 (3) {
["val"]=>
int(2)
["left"]=>
object(TreeNode)#3 (3) {
["val"]=>
int(4)
["left"]=>
NULL
["right"]=>
object(TreeNode)#4 (3) {
["val"]=>
int(7)
["left"]=>
NULL
["right"]=>
NULL
}
}
["right"]=>
NULL
}
["right"]=>
object(TreeNode)#5 (3) {
["val"]=>
int(3)
["left"]=>
object(TreeNode)#6 (3) {
["val"]=>
int(5)
["left"]=>
NULL
["right"]=>
NULL
}
["right"]=>
object(TreeNode)#7 (3) {
["val"]=>
int(6)
["left"]=>
object(TreeNode)#8 (3) {
["val"]=>
int(8)
["left"]=>
NULL
["right"]=>
NULL
}
["right"]=>
NULL
}
}
}

[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现的更多相关文章

  1. 【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [ ...

  2. Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树

    Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序遍历序列构造二叉树 Leetcode:105. 从前序与中序遍历序列构造二叉树&106. 从中序与后序 ...

  3. Java实现 LeetCode 105 从前序与中序遍历序列构造二叉树

    105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中 ...

  4. [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)

    题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...

  5. LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)

    题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...

  6. LeetCode(105):从前序与中序遍历序列构造二叉树

    Medium! 题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inor ...

  7. 027依据前序遍历和中序遍历,重建二叉树(keep it up)

    剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385 题目描写叙述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.如果输入的前序遍历和中 ...

  8. 【LeetCode】105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与中序遍历序列构造二叉树(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  9. [Swift]LeetCode105. 从前序与中序遍历序列构造二叉树 | Construct Binary Tree from Preorder and Inorder Traversal

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...

随机推荐

  1. 从中央仓库下载所想要的jar包

    中央仓库地址:https://mvnrepository.com/ 这边我搜索一个commons-logging包作为例子: 点击下面第二个绿色的comons-logging进入这个页面: 一.win ...

  2. python调用 sshpass

    [root@qinhan ~]# ifconfig eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ine ...

  3. vue使用矢量图

    1.在阿里巴巴矢量图标下载下来 2.放到static下 3.main.js下 import '../static/iconfont/iconfont.css' 4.调用<i class=&quo ...

  4. B - Dropping tests

    In a certain course, you take n tests. If you get ai out of bi questions correct on test i, your cum ...

  5. Lerning Entity Framework 6 ------ Joins and Left outer Joins

    Joins allow developers to combine data from multiple tables into a sigle query. Let's have a look at ...

  6. ubuntu下TFTP Server 的安装和使用方法

    tftp是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP).小型文件传输协议非常简单,通过少量存储器就能轻松实现 ——这在当时是很重要的考虑因素.所以TFTP被用于引导计算机,例如 ...

  7. 简介 - RESTful

    RESTful REST(Representational State Transfer,表现层状态转化),可以简单理解为"资源在网络中以某种表现形式进行状态转移" Resourc ...

  8. Linux - 创建定时任务

    crontab命令 用来创建周期性定时任务 crontab {-l|-r|-e} -l 显示当前的 crontab -r 删除当前的 crontab -e 使用编辑器编辑当前 crontab 文件 输 ...

  9. LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium

    题目:Binary Tree Preorder Traversal 二叉树的前序遍历,同样使用栈来解,代码如下: struct TreeNode { int val; TreeNode* left; ...

  10. fast.ai(零)windows + pytorch 0.4

    一.下载 git clone https://github.com/fastai/fastai.git 或者直接下载下来 二.安装pytorch 去官网安装建议安装即可 https://pytorch ...