修炼内功---数据结构与算法30---二叉树的遍历

本文详细介绍了二叉树的前序、中序和后序遍历方式,通过递归算法实现了每种遍历方式,并提供了PHP代码示例。了解这些遍历方式有助于将二叉树转换为线性序列,便于计算机操作。

二叉树的遍历指的是从根节点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次

有多种方式可以遍历二叉树,如果限制从左到右的习惯方式,主要分为三种:前序遍历、中序遍历和后序遍历。
下面我们简单介绍这几种遍历方式及对应实现算法,所谓的前序、中序和后序都是以根节点作为参照系

前序遍历
二叉树为空,则返回空,否则从根节点开始,先遍历左子树,再遍历右子树
 

<?php
/**
 * Created by PhpStorm.
 * User: hang
 * Date: 2018/12/27
 * Time: 16:46
 */

// 二叉链表节点
class Node
{
    public $data;
    public $left = null;
    public $right = null;

    public function __construct($data)
    {
        $this->data = $data;
    }
}

/**
 * 前序遍历
 * @param Node $tree
 */
function preOrderTraverse($tree)
{
    if ($tree == null) return;
    printf("%s\n", $tree->data);
    preOrderTraverse($tree->left);
    preOrderTraverse($tree->right);
}


$node1        = new Node('A');
$node2        = new Node('B');
$node3        = new Node('C');
$node4        = new Node('D');
$node5        = new Node('E');
$node6        = new Node('F');
$node7        = new Node('G');
$node1->left  = $node2;
$node1->right = $node3;
$node2->left  = $node4;
$node2->right = $node5;
$node3->left  = $node6;
$node3->right = $node7;

preOrderTraverse($node1);   //  A B D E C F G

中序遍历
如果是空树,返回空,否则从左子树最左侧的节点开始,然后从左到右依次遍历左子树,真正的根节点,最后是右子树(依然是从最左侧节点开始从左到右的顺序遍历)
 

<?php
/**
 * Created by PhpStorm.
 * User: hang
 * Date: 2018/12/27
 * Time: 16:46
 */

// 二叉链表节点
class Node
{
    public $data;
    public $left = null;
    public $right = null;

    public function __construct($data)
    {
        $this->data = $data;
    }
}


/**
 * 中序遍历
 * @param Node $tree
 */
function midOrderTraverse($tree)
{
    if ($tree == null) return;
    midOrderTraverse($tree->left);
    printf("%s\n", $tree->data);
    midOrderTraverse($tree->right);
}


$node1        = new Node('A');
$node2        = new Node('B');
$node3        = new Node('C');
$node4        = new Node('D');
$node5        = new Node('E');
$node6        = new Node('F');
$node7        = new Node('G');
$node1->left  = $node2;
$node1->right = $node3;
$node2->left  = $node4;
$node2->right = $node5;
$node3->left  = $node6;
$node3->right = $node7;


midOrderTraverse($node1);   //  D B E A F C G

后序遍历

如果是空树,返回空,否则还是从左子树最左侧的节点开始,先遍历完叶子节点,再遍历父节点,遍历完左子树后,直接从右子树最左侧节点开始,按照和左子树同样的顺序遍历完右子树,最后访问根节点
 

<?php
/**
 * Created by PhpStorm.
 * User: hang
 * Date: 2018/12/27
 * Time: 16:46
 */

// 二叉链表节点
class Node
{
    public $data;
    public $left = null;
    public $right = null;

    public function __construct($data)
    {
        $this->data = $data;
    }
}


/**
 * 后序遍历
 * @param Node $tree
 */
function postOrderTraverse($tree)
{
    if ($tree == null) return;
    postOrderTraverse($tree->left);
    postOrderTraverse($tree->right);
    printf("%s\n", $tree->data);
}

$node1        = new Node('A');
$node2        = new Node('B');
$node3        = new Node('C');
$node4        = new Node('D');
$node5        = new Node('E');
$node6        = new Node('F');
$node7        = new Node('G');
$node1->left  = $node2;
$node1->right = $node3;
$node2->left  = $node4;
$node2->right = $node5;
$node3->left  = $node6;
$node3->right = $node7;

postOrderTraverse($node1);  //  D E B F G C A

不同的遍历方式从不同维度将二叉树这种非线性的结构变成了某种意义上的线性序列,从而方便计算机操作

遍历实现算法
二叉树的遍历其实就是个递归的过程,所以对应算法也采用递归来实现
我们以二叉链表的方式来存储数组,对应的前序、中序、后序实现算法如下

下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简化的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值