二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。

<?php

namespace app\data_structure\tree;

/**
* php循环方法实现前序、中序、后序遍历二叉树
* 二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)
* https://www.cnblogs.com/rxbook/p/10419365.html
*/ class BinaryTree2
{
public $value;
public $left;
public $right;
} /**
* 前序遍历
* 根节点 ---> 左子树 ---> 右子树
*/
function preorder($root)
{
//PE($root);
$stack = array();
array_push($stack, $root); //将$root(树对象)放入数组$stack中
while (!empty($stack)) {
//删除数组中的最后一个元素,并返回数组的最后一个值,此处$tree返回的就是完整的$root树对象,此时$stack为空
$tree = array_pop($stack);
//PE($tree);
//PE($stack);
echo $tree->value . ' ';//先输出根节点 //由于在循环的过程中,每次array_pop都是删除最后一个元素并返回,因此要先将右子树压进去
if ($tree->right != null) {
array_push($stack, $tree->right);//压入右子树
} //再将左树压进去,这样能保证左树处于最后一个元素,下次循环就会先处理左子树
if ($tree->left != null) {
array_push($stack, $tree->left); //压入左子树
}
//PE($stack);
}
} /**
* 中序遍历
* 左子树---> 根节点 ---> 右子树
*/
function inorder($root)
{
$stack = array();
//最开始,让$tree=最原始的树
$tree = $root;
while (!empty($stack) || $tree != null) {
while ($tree != null) {
//将整个树存入$stack数组中,然后让树变成左子树,依次循环,把全部的左子树存入$stack数组
array_push($stack, $tree);
//直到最后一个左子树,已经没有了left节点,此时$tree为空。相当于把所有层次的树全都压入了$stack数组中
$tree = $tree->left;
}
//P($stack); //从$stack的尾部依次弹出元素并输出,结果就是左子树从最底部到最顶部的值
$tree = array_pop($stack);
echo $tree->value . " "; //此时,将 右子树赋值给 $tree。在没有到达主树之前,所有的右子树都是空,但是$stack不为空。
//也就导致下次内循环的 while($tree != null)不会执行,一直到左子树输出完毕,到达主树(此时$stack为空)。
//由于主树的右子树不为空,从而会执行 while($tree != null),然后会再次将右子树的左子树依次输出,直到输出完最后一个右子树(已经没有了左子树)
$tree = $tree->right;
//PE($tree);
}
} /**
* 后序遍历
* 左子树 ---> 右子树 ---> 根节点
*/
function tailorder($root)
{
$stack = array();
$outstack = array();
array_push($stack, $root);
while (!empty($stack)) {
$tree = array_pop($stack);
array_push($outstack, $tree);//最先压入根节点,最后输出
if ($tree->left != null) {
array_push($stack, $tree->left);
}
if ($tree->right != null) {
array_push($stack, $tree->right);
}
} while (!empty($outstack)) {
$tree = array_pop($outstack);
echo $tree->value . ' ';
}
} //测试
$a = new BinaryTree2();
$b = new BinaryTree2();
$c = new BinaryTree2();
$d = new BinaryTree2();
$e = new BinaryTree2();
$f = new BinaryTree2(); $a->value = 'A';
$b->value = 'B';
$c->value = 'C';
$d->value = 'D';
$e->value = 'E';
$f->value = 'F'; $a->left = $b;
$a->right = $c;
$b->left = $d;
$c->left = $e;
$c->right = $f; echo "php循环方法实现前序、中序、后序遍历二叉树: \n";
echo "前序遍历:";
preorder($a); //A B D C E F
echo "\n"; echo "中序遍历:";
inorder($a);//D B A E C F
echo "\n"; echo "后序遍历:";
tailorder($a);//D B E F C A
echo "\n";

结果:

A B D C E F


D B A E C F


D B E F C A

php循环方法实现先序、中序、后序遍历二叉树的更多相关文章

  1. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  2. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  3. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  4. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

  5. [Java]算术表达式求值之一(中序表达式转后序表达式方案)

    第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...

  6. LeetCode:二叉树的前、中、后序遍历

    描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ...

  7. 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现

    文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...

  8. 分别求二叉树前、中、后序的第k个节点

    一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...

  9. HDU 1710 (二叉树的前序和中序,求后序)

    题目链接 题目大意: 输入二叉树的前序.中序遍历,请输出它的后序遍历 #include <stdio.h> #include <string.h> ; // 长度为n s1 前 ...

  10. HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...

随机推荐

  1. 题目1018:统计同成绩学生人数(数组或者map)

    题目链接:http://ac.jobdu.com/problem.php?pid=1018 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  2. Unity3D Shader 按百分比裁剪模型

       Shader Shader "Unlit/Disappear" { Properties { _MainTex ("Texture", 2D) = &qu ...

  3. Socket 服务端使用多线程实现多客户端通讯实例

    socket通信原理 Java多线程实现Socket通讯 1.服务端 import java.io.IOException; import java.net.ServerSocket; import ...

  4. NHibernate之旅(21):探索对象状态

    本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...

  5. VS2015 工具箱 保存位置

    我的文档\Visual Studio 2015\Settings\CurrentSettings.vssettings Environment_Toolbox 节点 <Category name ...

  6. PAT甲级1013-1014-1015

    题目:1013 Battle Over Cities 思路:城市数也就1000, 对于每次询问暴力bfs一下看一下有多少连通块就行了.答案就是联通块数减一. #include<stdio.h&g ...

  7. 体验 PHP under .NET Core

    昨天在 The week in .NET 中发现 Scott Hanselman 的这篇博文 Peachpie - Open Source PHP Compiler to .NET and WordP ...

  8. Codeforces 191A - Dynasty Puzzles - [DP]

    题目链接:https://codeforces.com/problemset/problem/191/A 题意: 给出 $n$ 个小写字母组成的字符串,两个字符串如果前者的最后一个字母与后者的首字母相 ...

  9. POJ 2027 - No Brainer

    Description Zombies love to eat brains. Yum. Input The first line contains a single integer n indica ...

  10. [No000013B]初识Ildasm.exe——IL反编译的实用工具

    Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello World 的 exe 可执行文件)抽取出 IL 代码,并且 ...