树是一种数据结构,二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。以某种特定顺序访问树中所有的节点称为树的遍历,今天在查看了这遍文章:https://www.cnblogs.com/ivy-zheng/p/10995492.html 中对树的遍历的实现之后我对其PHP遍历算法代码进行了重构,这次只是深度优先遍历。
所谓深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。可以细分为先序遍历、中序遍历、后序遍历。
从那里截个比较好的图来如下:
看了一下文章中的实现代码,觉得可以进行改进,于是动手使用PHP写了一下遍历程序。将三种遍历方法写在一起,同时对树的构建过程进行了优化整合,如下是我在word里面画的一个二叉树的结构图,而且是一个满二叉树,如下:
写的PHP遍历程序如下:
<?php
#author:04007.cn
#note:二叉树的遍历
class Element{
public $value;
public $left;
public $right;
public function __construct($value, $left=null, $right=null){
$attributes = get_class_vars(Element);
foreach($attributes as $key=>$val){
${$key} != null && $this->{$key} = ${$key};
}
}
}
$val60 = new Element(60);
$val75 = new Element(75);
$val90 = new Element(90);
$val99 = new Element(99);
$val65 = new Element(65, $val60, $val75);
$val95 = new Element(95, $val90, $val99);
$val88 = new Element(88, $val65, $val95);
print_r($val88);
#对树进行先序遍历、中序遍历、后序遍历
function readTree($tree, $type='first'){
if(!$tree || $tree->value==null){
return;
}else{
switch($type){
#中序遍历
case 'middle':
$tree->left != null && readTree($tree->left, $type);
echo $tree->value,',';
$tree->right != null && readTree($tree->right, $type);
break;
#后序遍历
case 'last':
readTree($tree->left, $type);
readTree($tree->right, $type);
echo $tree->value,',';
break;
#默认先序遍历
default:
echo $tree->value,',';
readTree($tree->left, $type);
readTree($tree->right, $type);
break;
}
}
}
echo '先序遍历:';readTree($val88);echo "\n";
echo '中序遍历:';readTree($val88,'middle');echo "\n";
echo '后序遍历:';readTree($val88,'last');echo "\n";
下面是在服务器上运行的结果:
[root@04007 php]# php tree.php
Element Object
(
[value] => 88
[left] => Element Object
(
[value] => 65
[left] => Element Object
(
[value] => 60
[left] =>
[right] =>
)
[right] => Element Object
(
[value] => 75
[left] =>
[right] =>
)
)
[right] => Element Object
(
[value] => 95
[left] => Element Object
(
[value] => 90
[left] =>
[right] =>
)
[right] => Element Object
(
[value] => 99
[left] =>
[right] =>
)
)
)
先序遍历:88,65,60,75,95,90,99,
中序遍历:60,65,75,88,90,95,99,
后序遍历:60,75,65,90,99,95,88,
标签:遍历,中序,tree,value,Element,right,二叉树,left
From: https://blog.csdn.net/weixin_47792780/article/details/137216164