tree.php

<?php
require_once "./zhan.php";
class BinNode{public $ch;public $lchild;public $rchild;public function __construct($data){$this->ch=$data;$this->lchild=null;$this->rchild=null;}}//封装自己数据类型
class mydata{public $BinNode;public $status;public function __construct($data,$status){$this->BinNode=$data;$this->status=$status;}
}class twofucktree{//初始化public function init_tree(){/*AB        FC             G
D   E        H*/$nodeA= new BinNode('A');$nodeB= new BinNode('B');$nodeC= new BinNode('C');$nodeD= new BinNode('D');$nodeE= new BinNode('E');$nodeF= new BinNode('F');$nodeG= new BinNode('G');$nodeH= new BinNode('H');$nodeA->lchild = $nodeB;$nodeA->rchild = $nodeF;$nodeB->rchild = $nodeC;$nodeC->lchild = $nodeD;$nodeC->rchild = $nodeE;$nodeF->rchild = $nodeG;$nodeG->lchild = $nodeH;return $nodeA;}//求树的高度public function gao($root,&$height){if($root==null){return;}$lheight = $this->gao($root->lchild,$height);$rheight = $this->gao($root->rchild,$height);$height = $lheight>$rheight?$lheight+1:$rheight+1;return $height;}//先序public function xianxu($root){if($root==null){return;}echo $root->ch." ";$this->xianxu($root->lchild);$this->xianxu($root->rchild);}//中序public function zhongxu($root){if($root==null){return;}$this->zhongxu($root->lchild);echo $root->ch." ";$this->zhongxu($root->rchild);}//后序public function houxu($root){if($root==null){return;}$this->houxu($root->lchild);$this->houxu($root->rchild);echo $root->ch." ";}//叶子节点数public function yezi($root,&$geshu){if($root==null){return;}if($root->lchild==null && $root->rchild==null){$geshu++;}$this->yezi($root->lchild,$geshu);$this->yezi($root->rchild,$geshu);}//非递归遍历public function feidigui($root){if(null==$root){return;}// $mydata = new mydata($root,false);// echo $mydata->BinNode->ch;$stack = new my_stack();//接受返回的链表$lk=$stack->init_stack();//压入栈$stack->push_link($lk,new mydata($root,false));while($stack->get_size($lk)>0){$nownode = $stack->get_top($lk);$stack->pop_stack($lk);if($nownode->status==true){echo $nownode->BinNode->ch."&nbsp;";$nownode=null;continue;}else{//先序遍历 根左右  押入顺序 右左根if($nownode->BinNode->rchild!=null){$stack->push_link($lk,new mydata($nownode->BinNode->rchild,false));}if($nownode->BinNode->lchild!=null){$stack->push_link($lk,new mydata($nownode->BinNode->lchild,false));}$nownode->status=true;$stack->push_link($lk,$nownode);}}}}$tree = new twofucktree();$root = $tree->init_tree();$tree->xianxu($root);
echo "<br />";
$tree->zhongxu($root);
echo "<br />";
$tree->houxu($root);
echo "<br />";
$gao=0;
$tree->gao($root,$gao);
echo "树的高度height={$gao}<br />";
$geshu=0;
$tree->yezi($root,$geshu);echo "叶子节点的个数{$geshu}个<br />";
echo "非递归遍历<br />";
$tree->feidigui($root);
/*
A B C D E F G H
B D C E A F H G
D E C B H G F A
树的高度height=4
叶子节点的个数3个
非递归遍历
A B C D E F G H */?>

非递归遍历用到栈

zhan.php

<?php//链表list
class linklist{public $linknode;public $size;}
//链表节点
class linknode {public $data;public $next;public function __construct($data) {$this->data=$data;$this->next=null;}}//栈的类
class  my_stack{//初始化public function init_stack(){$lk = new linklist();$header = new linknode(-1);$lk->linknode = $header;$lk->size=0;return $lk;}//入栈public function push_link($lk,$data){//echo '11';exit;$new_node = new linknode($data);$new_node->next = $lk->linknode->next;$lk->linknode->next=$new_node;$lk->size++;// return $lk;}//获取长度public function get_size($lk){return $lk->size;}//获得栈顶元素//public function get_top($lk){$current = $lk->linknode->next;return $current->data;}//出栈public function  pop_stack($lk){$del_node = $lk->linknode->next;$lk->linknode->next = $del_node->next;$lk->size--;$del_node=null;}
}
/*$stack = new my_stack();//接受返回的链表$lk=$stack->init_stack();//入栈$stack->push_link($lk,10);$stack->push_link($lk,20);$stack->push_link($lk,30);
//遍历 判断元素>0 然后获得栈顶元素,输出后 再弹出栈while($stack->get_size($lk)>0){$res= $stack->get_top($lk);echo $res."<br />";$stack->pop_stack($lk);}30
20
10*/?>

用到队列和栈 如果这里没贴出来  都可以参考之前文章的

基本上队列和栈 都是用链表实现的 比数组的麻烦些

如果是数组 直接下标0入栈 size++  出栈直接取size-1 然后size--就ok了

php二叉树基本遍历和非递归遍历相关推荐

  1. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  2. 实现二叉树的三种非递归遍历算法

    [问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...

  3. 二叉树的后序非递归遍历(巧妙思想)

    大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...

  4. C++-二叉树递归遍历与非递归遍历实现

    -二叉树递归遍历与非递归遍历实现 引言 0 有关线性表结点定义-LinkNode 1 栈的链式存储结构实现-LinkedStack 2 队列的链式存储结构实现-LinkedQueue 3 二叉树的链式 ...

  5. 二叉树的递归遍历和非递归遍历实现(C++)(深度优先)

    二叉树的递归遍历和非递归遍历(C++) 二叉树的遍历方式可分为先序遍历,中序遍历和后序遍历 先序遍历:先遍历根节点,再遍历左子节点,最后遍历右子节点. 中序遍历:先遍历左子节点,再遍历根节点,最后遍历 ...

  6. 二叉树的中序非递归遍历

    二叉树的中序非递归遍历 中序遍历的非递归算法描述如下: 从根节点开始检索,如果当前节点不为空,则将当前节点入栈,让当前节点成为其左孩子节点,再继续上一步的操作 加入当前节点为空了,说明其父节点已经没有 ...

  7. 二叉树的递归遍历及非递归遍历

    二叉树的基本操作--创建.输出.查找.删除_yyy_zxc的博客-CSDN博客_二叉树的创建与输出创建二叉树过程:/*-----------第一轮循环:ch = A;p->data保存结点值b= ...

  8. 二叉树的递归遍历与非递归遍历

    二叉树的遍历有递归与非递归两种方式,但思想大致相同 前序:先打印然后遍历完他的左子树,左子树为空时开始返回,并且开始以栈中元素为根遍历右子树 中序:先遍历左子树然后左子树入栈,左子树为空再打印,再遍历 ...

  9. 【数据结构】--- 二叉树的递归遍历和非递归遍历【C语言实现】

    目录 1. 创建一颗二叉树 2.递归前序遍历二叉树 3.递归中序遍历二叉树 4.递归后序遍历二叉树 5. 测试递归打印二叉树代码 6. 非-递归前序遍历二叉树 7. 非-递归实现中序遍历二叉树 8.  ...

  10. 二叉树创建,递归遍历,非递归遍历

    二叉树 博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦.这 ...

最新文章

  1. javamap的用法_Java Map常用的几种用法。
  2. 使用DOSBox编译汇编代码
  3. CCNA第十一章学习笔记OSPF简介
  4. 如何基于DataWorks构建数据中台?
  5. 多种方法解决Exchange 2010 EMC批量启用邮箱之后出..
  6. 安装Pytorch如何选择CUDA的版本
  7. Taro+react开发(80):状态改变的构造函数
  8. python腐蚀膨胀代码_OpenCV+python实现膨胀和腐蚀的示例
  9. Qt将QString转换成ASCII码
  10. logback mysql 中文乱码_[Logback+slf4j]MysqlDBAppender正确配置方法以及错误处理
  11. vod点歌系统服务器,冰河家庭VOD点歌系统
  12. 权限漏洞:水平权限漏洞、垂直权限漏洞
  13. i5 12400f参数 i512400f评测
  14. 2023轻薄投影仪选哪款?极米Z6X Pro成年轻人租房首选投影
  15. yocto编译linux,好实用!用 Yocto 在 Ubuntu 上创建最小化 Linux 发行版
  16. (二)向前 向后 中心差商
  17. YbtOj#20073. 「NOIP2020 模拟赛 B 组 Day6」钻石守卫
  18. 硬件(esp32),服务器(python),前端,三端联调的电子琴项目,可以实现多种乐器奏乐。
  19. DataParallel layers (multi GPU)
  20. LostRoutes项目日志——玩家飞机精灵Fighter解析

热门文章

  1. 机器学习-吴恩达-笔记-12-推荐系统
  2. JavaScript学习之Object(下)this
  3. Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)
  4. JS, CSS 文件压缩与反压缩工具
  5. 限速访问文件服务器,利用nginx实现文档服务器限速
  6. hashmap java 便利_java HashMap 循环遍历map的方法
  7. MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树
  8. antd权限管理_Ant Design Pro开发后台管理系统(权限)-阿里云开发者社区
  9. STM32之输入捕获
  10. mysql ----DML(掌握)