根据前序序列和中序序列,重建一颗树(PHP递归实现)

class TreeNode{
	public $data;
	public $lchild = null;
	public $rchild = null;
	public function __construct($data='',$lchild=null,$rchild=null){
		$this->data = $data;
		$this->lchild = $lchild;
		$this->rchild = $rchild;
	}
}
    //根据前序和中序,重建一颗树
	//$pre 前序遍历的数组
	//$mid 中序遍历的数组
	function buildTree($pre,$mid){
		$cnt = count($mid);
		if($cnt<0) return null;
		$root = $pre[0];
		echo '$root==='.$root;
		$node = new TreeNode($root);
		$lenL = 0;
		for($i=0;$i<$cnt;$i++){
			if($mid[$i]== $root){
				$lenL = $i;
				break;
			}
		}
		$lenR = $cnt -$lenL - 1;
		if($lenL>0) $node->lchild = buildTree(array_slice($pre,1,$lenL),array_slice($mid,0,$lenL));
		if($lenR>0) $node->rchild = buildTree(array_slice($pre,$lenL+1,$lenR),array_slice($mid,$lenL+1,$lenR));
		return $node;
	}

	$mid = array(4,7,2,1,5,3,8,6);
	$pre = array(1,2,4,7,3,5,6,8);
	$node = buildTree($pre,$mid);
	echo '<pre>';
	var_dump($node);
	echo '</pre>';

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 21:07:25

根据前序序列和中序序列,重建一颗树(PHP递归实现)的相关文章

前序遍历和中序遍历重建二叉树

对于二叉树,在此我不做过多讲解,如有不懂,请参照一下链接点击打开链接 1.在此二叉树的定义: struct BinaryTreeNode     {         BinaryTreeNode<T> *_Left;         BinaryTreeNode<T> *_Right;         T _data;     public:         BinaryTreeNode(const T& x)             :_Left(NULL)       

二叉树先序序列和中序序列求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

根据二叉树的先序序列和中序序列还原二叉树并打印后序序列

#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; struct Node { int value; Node *left; Node *right; Node(int value) { this->value = value; left = right = NULL; } }; bool bNotTree = false; Node* RebuildTree(i

hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4210    Accepted Submission(s): 1908 Problem Description A binary tree is a

根据二叉树的前序遍历和中序遍历重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(

二叉树(14)----由前序遍历和中序遍历重建二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 二.根据前序遍历序列和中序遍历序列重建二叉树 算法说明: 由中序遍历序

由先序序列和中序序列生成一棵二叉树

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct BiTNode{ char e; struct BiTNode *lchild,*rchild; }BiTNode; void preOrderTravse(BiTNode *T1){ if(T1){ printf("%c",T1->e); preOrderTravse(T1->lchild); p

图的建立及输出其先序序列,中序序列,后续序列

1 #include<stdio.h> 2 #include<malloc.h> 3 typedef struct node{ 4 char data; 5 struct node *left; 6 struct node *right; 7 }Node; 8 9 int i = 0; 10 char str[100]; 11 12 void create(Node** p){ 13 if(str[i] == '\0') 14 return ; 15 if(str[i++] !=

leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现

Binary Tree Preorder Traversal:https://leetcode.com/problems/binary-tree-preorder-traversal/ Binary Tree Inorder Traversal :https://leetcode.com/problems/binary-tree-inorder-traversal/ Binary Tree Postorder Traversal:https://leetcode.com/problems/bin