/**
* PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
* A
* B C
* D E F G
* H
* 先序遍历:先遍历根节点,然后遍历左节点,最后遍历右节点: ABDHECFG
* 中序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树: HDBEAFCG
* 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点: HDEBFGCA
* */
/*先序遍历:利用栈的先进后出特性,先访问根节点,再把右子树压入,再压入左子树.这样取出的时候是先取出左子树,最后取出右子树*/
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 != null){
while($center_node != null ){
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 tailOrder($root){
$stack = array();
$outStack = array();
array_push($$stack, $root);
while($empty($stack)){
$center_node = array_pop($stack);
array_push($outStack,$center_node);
if($center_node->right != null){
array_push($stack,$center_node->left);
}
}
while($empty($outStack)){
echo $center_node->value;
}
}
相关文章
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
- 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)
- BFS、DFS、先序、中序、后序遍历的非递归算法(java)
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
- 二叉树的创建(先序)先序中序后序遍历(递归算法),求叶子结点个数,求树的高度,树中结点的个数,值为data的结点所在的层数
- 数据结构(一)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- PHP基于非递归方式算法实现先序/中序/后序遍历二叉树操作
- Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
- C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)