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;
        }
    }
}
posted @ 2022-10-31 17:50  vx_guanchaoguo0  阅读(87)  评论(0编辑  收藏  举报