php 二叉树的几种遍历方式,OI.share - 个人站点 - PHP实现二叉树遍历(非递归方式,栈模拟实现)...

/**

* PHP实现二叉树遍历(非递归方式,栈模拟实现)

* 二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式:

* ① NLR:前序遍历(PreorderTraversal亦称(先序遍历))

*   ——访问结点的操作发生在遍历其左右子树之前。

* ② LNR:中序遍历(InorderTraversal)

*   ——访问结点的操作发生在遍历其左右子树之中(间)。

* ③ LRN:后序遍历(PostorderTraversal)

*   ——访问结点的操作发生在遍历其左右子树之后。

*/

class node

{

public $value;

public $left;

public $right;

public function __construct($value) {

$this->value = $value;

}

}

//前序遍历,访问根节点->遍历子左树->遍历子右树

function preorder($root) {

$stack = array();

array_push($stack, $root);

while (!empty($stack)) {

$center_node = array_pop($stack);

echo $center_node->value . ' ';

if ($center_node->right !== null) {

array_push($stack, $center_node->right);

}

if ($center_node->left !== null) {

array_push($stack, $center_node->left);

}

}

}

//中序遍历,遍历子左树->访问根节点->遍历子右树

function inorder($root) {

$stack = array();

$center_node = $root;

while (!empty($stack) || $center_node) {

// 遍历节点

while ($center_node) {

array_push($stack, $center_node);

$center_node = $center_node->left;

}

$center_node = array_pop($stack);

echo $center_node->value . ' ';

//在输出节点时,需要把子右树加入栈,后入先出,所以,子右树跟在节点后输出

$center_node = $center_node->right;

}

}

//后序遍历,遍历子左树->访问子右树->遍历根节点

function postorder($root) {

$pushstack = array();

$visitstack = array();

array_push($pushstack, $root);

while (!empty($pushstack)) {

$center_node = array_pop($pushstack);

array_push($visitstack, $center_node);

if ($center_node->left != null) {

array_push($pushstack, $center_node->left);

}

if ($center_node->right != null) {

array_push($pushstack, $center_node->right);

}

}

while (!empty($visitstack)) {

$center_node = array_pop($visitstack);

echo $center_node->value . ' ';

}

}

$a = new node('A');

$b = new node('B');

$c = new node('C');

$d = new node('D');

$e = new node('E');

$f = new node('F');

$a->left = $b;

$a->right = $c;

$b->left = $d;

$b->right = $d;

$c->left = $e;

$c->right = $f;

preorder($a);

echo '
';

inorder($a);

echo '
';

postorder($a);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值