数据结构-二叉树
程序员文章站
2022-03-14 22:52:39
...
二叉树的生成及前序、中序和后序遍历
<?php
/**
* 节点
*/
class Node
{
public $node;//节点
public $leftChild;//左孩子
public $rightChild;//右孩子
public function __construct($node)
{
$this->node = $node;
$this->leftChild = '';
$this->rightChild = '';//默认是空
}
}
/**
* 二叉树
*/
class Btree
{
public $root = '';//子树,在此基础上扩展二叉树
static function index()
{
echo '';
}
/**
* [insertNode 插入节点]
* @param [type] $child [需要插入的数据元素,还不是节点]
* @return [type] [description]
*/
public function insertNode($child)
{
$newNode = new Node($child);//转换成子树
if ($this->root == null) {//如果没有子树,把第一个子树赋值给根子树
$this->root = $newNode;
}else{
$this->getInsertTree($this->root,$newNode);
}
}
/**
* [getInsertTree 遍历插入,形成二叉树,(已存在根节点)]
* @param [type] $parent [根子树]
* @param [type] $child [新插入的子树,如果新子树的节点小于根子树的节点,则和根子树的左孩子比较,如果大于则和根子树的右孩子比较]
* @return [type] [description]
*/
public function getInsertTree($parent,$child)
{
if (isset($child->node) && isset($parent->node)) {
if ($child->node<$parent->node) {//如果节点小于根节点,看根节点的左孩子是否存在
if ($parent->leftChild == null) {//如果左孩子不存在
$parent->leftChild = $child;
}else{
$this->getInsertTree($parent->leftChild,$child);
}
}else{
//如果大于等于根节点
if ($parent->rightChild == null) {//如果没有右孩子,把新节点放到右边
$parent->rightChild = $child;
}else{
$this->getInsertTree($parent->rightChild,$child);
}
}
}
}
/**
* [getPreorder 前序遍历,根->左->右]
* @param [type] $tree [一棵树]
* @return [type] [description]
*/
public function getPreorder($tree)
{
// print_r($tree);exit;//需要遍历的树
if (isset($tree->node)) {//如果树存在
echo $tree->node,'--';
if(isset($tree->leftChild))//如果左孩子存在
{
$this->getPreorder($tree->leftChild);
}
if(isset($tree->rightChild))//如果右孩子存在
{
$this->getPreorder($tree->rightChild);
}
}
}
/**
* [getMiddelorder 中序遍历,左->根->右,首先要遍历二叉树的左子树,接着遍历根节点,最后遍历右子树。如果子节点下边还有子节点也是按照左根右的顺序]
* @param [type] $tree [一棵树]
* @return [type] [description]
*/
public function getMiddelorder($tree)
{
if (isset($tree->node)) {
if (isset($tree->leftChild)) {//如果有左孩子则遍历
$this->getMiddelorder($tree->leftChild);
}
echo $tree->node,'--';
if (isset($tree->rightChild)) {//如果有右孩子则遍历
$this->getMiddelorder($tree->rightChild);
}
}
}
/**
* [getPostorder 后序遍历,左->右->根,首先按照后序遍历的规则遍历左子树,接着按照后序遍历的规则遍历右子树,最后访问根节点。]
* @param [type] $tree [description]
* @return [type] [description]
*/
public function getPostorder($tree)
{
if (isset($tree->node)) {
if (isset($tree->leftChild)) {
$this->getPostorder($tree->leftChild);
}
if (isset($tree->rightChild)) {
$this->getPostorder($tree->rightChild);
}
echo $tree->node,'--';
}
}
}
$nodes = [34,2,111,43,12,32,234,42,321,24,24,53];
$bTree = new Btree();//实例化对象
foreach ($nodes as $node) {//循环调用插入方法
$bTree->insertNode($node);//$node为数组中的元素
}
//前序遍历,根->左->右
$bTree->getPreorder($bTree->root);//34--2--12--32--24--24--111--43--42--53--234--321--
echo "<br>";
//中序遍历,左->根->右
$bTree->getMiddelorder($bTree->root);//2--12--24--24--32--34--42--43--53--111--234--321--
echo "<br>";
//后序遍历
$bTree->getPostorder($bTree->root);//24--24--32--12--2--42--53--43--321--234--111--34--
?>