PHP 二叉树的遍历
二叉树遍历
- 前序
- 中序
- 后序
递归写法基本一致 但是思路就是每个节点 都会访问三次
- 只输出第一发音值 则是前序
- 是输出二次访问 则是 中序
- 是输出第三次访问 则是 后续
点击查看代码
class Node
{
public $value;
public $child_left;
public $child_right;
}
$a = new Node();
$b = new Node();
$c = new Node();
$d = new Node();
$e = new Node();
$f = new Node();
$g = new Node();
$h = new Node();
$i = new Node();
$a->value = '1';
$b->value = '2';
$c->value = '3';
$d->value = '4';
$e->value = '5';
$f->value = '6';
$g->value = '7';
$a->child_left = $b;
$a->child_right = $c;
// 2
// 4 5
$b->child_left = $d;
$b->child_right = $e;
// 3
// 6 7
$c->child_left = $f;
$c->child_right = $g;
function tree($head)
{
if (!$head) {
return;
}
// 第一次
echo $head->value, PHP_EOL;
tree($head->child_left);
// 第二次 echo $head->value,PHP_EOL;
tree($head->child_right);
// 第三次 echo $head->value,PHP_EOL;
}
非递归 前序
- 准备一个 栈 先入头节点
- 然后 弹出节点
- 存在右节点 则入又
- 存在左节点则入 左节点
- 栈非空 则重复 弹出 右 左
点击查看代码
function tree_1($head)
{
$stack = [];
array_push($stack,$head) ;
while (!empty($stack)) {
$node = array_pop($stack);
echo $node->value, PHP_EOL;
if ($node->child_right != null) {
$stack[] = $node->child_right;
}
if ($node->child_left != null) {
$stack[] = $node->child_left;
}
}
}
后序遍历
- 和前序不同的 先入左 在入右 然后反转整个栈
- 先入根节点
- 弹出 进入辅助栈
- 存在左节点 入栈
- 存在有 右点节点入栈
- 栈非空 则 重复 弹出到辅助栈 坐 右
点击查看代码
function tree_end($head)
{
$help = [];
array_push($stack,$head) ;
while (!empty($stack)) {
$node = array_pop($stack);
array_push($help ,$node) ;
if ($node->child_left != null) {
$stack[] = $node->child_left;
}
if ($node->child_right != null) {
$stack[] = $node->child_right;
}
}
while (!empty($help)) {
$node = array_pop($help);
echo $node->value, PHP_EOL;
}
}
中序 非递归
- 栈非空 和 节点非空的时候 将非空的节点的 左子树全部入栈
- 然后弹出节点 后 继续到下一个右节节点
- 这样就是 左中右
点击查看代码
function tree_in($node)
{
$stack = [];
while (!empty($stack) || !empty($node)) {
if (!empty($node)) {
$stack[] = $node;
$node = $node->child_left;
} else {
$node = array_pop($stack);
echo $node->value, PHP_EOL;
$node = $node->child_right;
}
}
}
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16845211.html