遍历二叉树,这个相对比较复杂。

二叉树的便利,主要有两种,一种是广度优先遍历,一种是深度优先遍历。

什么是广度优先遍历?就是根节点进入,水平一行一行的便利。

什么是深度优先遍历呢?就是根节点进入,然后按照一个固定的规律,一直向下走,一个方向的子树遍历之后再遍历另一个方向的子树。

深度优先遍历,主要有三种顺序遍历:先序(先输出根节点),中序(第二个输出根节点),后序(最后输出根节点)。

直接上代码吧。

 class Node {
public $data = null;
public $left = null;
public $right = null;
} $node1 = new Node();
$node2 = new Node();
$node3 = new Node();
$node4 = new Node();
$node5 = new Node();
$node6 = new Node();
$node7 = new Node();
$node8 = new Node();
$node9 = new Node(); $node1->data = 1;
$node2->data = 2;
$node3->data = 3;
$node4->data = 4;
$node5->data = 5;
$node6->data = 6;
$node7->data = 7;
$node8->data = 8;
$node9->data = 9; $node1->left = $node2;
$node1->right = $node3;
$node2->left = $node4;
$node2->right = $node5;
$node3->left = $node6;
$node3->right = $node7;
$node4->left = $node8;
$node4->right = $node9;

以上代码,简单建立一个二叉树,如下图:

广度优先遍历

 // 二叉树广度优先遍历
function binary_tree1($node) {
$result = [];//保存结果
$memc = [];
array_push($memc, $node);//根节点入队
while (!empty($memc)) {//持续输出节点,直到队列为空
$cnode = array_shift($memc);//最前边的元素出队
$result[] = $cnode->data;//记录当前节点的值
//左节点先入队,然后右节点入队
if ($cnode->left != null)
array_push($memc, $cnode->left);
if ($cnode->right != null)
array_push($memc, $cnode->right);
}
return $result;
} print_r(binary_tree2($node1));

深度优先遍历(先序)

 // 二叉树深度优先遍历(先序)
function binary_tree2($node)
{
$result = [];//结果数组
$memc = [];
array_push($memc, $node);//将根节点压栈
while (!empty($memc)) {
$cnode = array_pop($memc);//弹出刚刚压栈的节点
$result[] = $cnode->data;
//因为先进后出原则,想先显示左子树,所以先压入右子树
if ($cnode->right != null) {
array_push($memc, $cnode->right);
}
if ($cnode->left != null) {
array_push($memc, $cnode->left);
}
}
return $result;
} print_r(binary_tree2($node1));

PHP遍历二叉树的更多相关文章

  1. 数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

  2. 【面经】用递归方法对二叉树进行层次遍历 && 二叉树深度

    void PrintNodeAtLevel(BiTree T,int level) { // 空树或层级不合理 ) return; == level) { cout << T->da ...

  3. YTU 2345: 后序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2345/2611.html 2345: 后序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决:  ...

  4. YTU 2346: 中序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2346/2606.html 2346: 中序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 12  解决: ...

  5. C++ 创建和遍历二叉树

    一个简单的创建和遍历二叉树的C++程序,二叉树的其他操作程序待更新. #include <iostream> using namespace std; struct BiTNode{ ch ...

  6. YTU 2344: 先序遍历二叉树

    原文链接:https://www.dreamwings.cn/ytu2344/2603.html 2344: 先序遍历二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 4  解决:  ...

  7. Leetcode 94. Binary Tree Inorder Traversal (中序遍历二叉树)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  8. 基于visual Studio2013解决面试题之0401非递归遍历二叉树

     题目

  9. Java遍历二叉树深度宽度

    节点数据结构 class TreeNode { TreeNode left = null; TreeNode right = null; } 最大深度,基本思路是:使用递归,分别求出左子树的深度.右子 ...

  10. Morris遍历-如何用空间复杂度O(1)来遍历二叉树

    参照和学习: https://www.cnblogs.com/AnnieKim/archive/2013/06/15/morristraversal.html 解决的问题:如何使用空间复杂度O(1), ...

随机推荐

  1. css学习_css布局案例

    1.中间栏先加载  !!!(若不是这个条件的话  ,那可以用  calc 或者flex布局来实现  中间栏自适应,左右栏定宽) 2.中间栏自适应   width:100% 3.左右栏固定宽 左中右  ...

  2. Windows 主机名映射地址

    在开发中大数据集群中我们自己的电脑主机名映射不到集群的主机名下面我们就去修改自己电脑 主机名映射地址 c/Windows/System32/drivers/etc/host   文件将主机名和IP地址 ...

  3. YOLO V3 错误总结

    问题1 TypeError: function takes exactly 1 argument (3 given) 报错说PIL库中的函数只接收到一个参数,应该给三个,自己在这里记录下解决方法,出错 ...

  4. Pycharm汉化

    简单的汉化方法:    需要把以下链接的文件放到Pycharm安装目录的lib目录下记得重启pycharm即可https://pan.baidu.com/s/1GG4zXZ_0xSB-AlDdu0Tu ...

  5. Appium自动化测试之Appium的安装与配置

    Appium自动化测试- Appium环境的安装与配置Appium中文文档: https://github.com/appium/appium/tree/master/docs/cn Appium的安 ...

  6. IP,IP地址,mac地址

    IP地址与IP是两个不同的概念.单独讲IP,是指IP协议 IP地址分为三类:单播地址(目的为单个主机):多播地址(目的端为同一组的所有主机):广播地址(目的端为网络上所有给定的主机) ip地址由网络和 ...

  7. SharePoint 已在此服务器场中安装 ID 为 XXXXXXXXX 的功能。请使用强制属性显式地重新安装此功能。解决方法

    图1: 图2: 解决方法: stsadm -o deploysolution -name ***.wsp -immediate -allowGacDeployment -url http://*** ...

  8. 运维面试题之linux编程

    吐槽: linux下的编程基本上都很简单包括shell 三剑客和vim的使用,也可能写ansible的playbook,有基础都是一两天可以学会的,正则表达式都是试出来的不知道有些面试官让我们在纸上写 ...

  9. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...

  10. flask hook

    @app.before_first_requestdef before_first_request(): """在第一次请求之前会访问该函数""&qu ...