引入

前面讲到了二叉搜索树以及它的一些基本操作(插入,搜索,删除),可是我们要怎么知道这些操作已经被执行了呢?换句话说,怎样来描述二叉树的结构。这里我们又用到了遍历

和图的遍历一样,我们也需要逐个访问每一个节点,但跟图不同的是,二叉树的遍历是从根节点开始的,而非任意节点。根据二叉树的结构我们知道,每棵二叉树都是由三部分组成的:根节点左子树右子树。而根节点的左右子树也是由这三部分组成,所以二叉树的遍历问题也是可以用分治来解决的,即遍历一颗二叉树 = 访问根节点 + 遍历根节点的左子树 + 遍历根节点的右子树。

因而我们写出下面的递归关系式:

其中

代表的是二叉树
的节点个数。因为当
为空树时,我们不执行任何操作,所以这里的
,即递归的出口。

三种遍历法

根据左子树、右子树和根节点的遍历顺序,我们可以把遍历方式分为前序中序后序遍历

前序遍历

前序遍历是先访问根节点,然后遍历左子树,最后遍历右子树。下面这张动图展示了前序遍历的整个过程。

代码实现:

def pre_order(T):print(T.value, end=' ')if T.left:pre_order(T.left)if T.right:pre_order(T.right)

中序遍历

中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。下面这张动图展示了中序遍历的整个过程。

代码实现:

def in_order(T):if T.left:in_order(T.left)print(T.value, end=' ')if T.right:in_order(T.right)

后序遍历

后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。下面这张动图展示了后序遍历的整个过程。

代码实现:

def post_order(T):if T.left:post_order(T.left)if T.right:post_order(T.right)print(T.value, end=' ')

因为遍历需要访问的节点数总是为

,所以无论是哪种遍历方式,其复杂度都为

本节全部代码

← 快速排序 | 算法与复杂度​zhuanlan.zhihu.com

→ 最近点对与凸包问题(DC)| 算法与复杂度​zhuanlan.zhihu.com

二叉树的基本操作_二叉树的遍历相关推荐

  1. java二叉树详解_二叉树详解

    树是一种比较重要的数据结构,尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒.本篇 ...

  2. 二叉树的基本操作(建立与遍历)

    [问题描述] 以二叉链表的形式创建二叉树(不超过20个结点),并编写二叉树的遍历算法,实现二叉树的先序.中序及后序三种遍历. [输入形式] 输入二叉树的结点信息(以先序遍历方式建立二叉树). [输出形 ...

  3. java二叉树的实现_二叉树的实现(Java语言描述)

    实现二叉树 并先序遍历之. package 二叉树的实现; public class BinaryTree { class Node { int value; // 该节点存储的值. Node lef ...

  4. 二叉树的直径_二叉树直径

    二叉树的直径 Problem statement: 问题陈述: Given a Binary Tree, find diameter of it. The diameter of a tree is ...

  5. 二叉树祖先节点_二叉树的祖先

    二叉树祖先节点 Problem statement: 问题陈述: Given a Binary Tree and a target key, write a function that prints ...

  6. java二叉树的序列化_二叉树的序列化和反序列化

    import java.util.LinkedList; import java.util.Queue; /** * 序列化和反序列化二叉树 * 先序.后序 * (中序不能实现) * 按层 */ pu ...

  7. 二叉树的基本操作(c语言)

    二叉树的基本操作 创建二叉树 二叉树的叶子节点 二叉树的节点总数 二叉树的高度 二叉树的基本遍历方法 创建二叉树 代码: // 创建二叉树,使用# void createBiTree(BiTree&a ...

  8. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  9. 多叉树的前序遍历_二叉树的非递归遍历的思考

    封面图来自wikipedia 1 简介 二叉树的深度优先遍历(前序遍历.中序遍历.后序遍历)是一个比较基本的操作.如果使用递归的做法,很容易写出相应的程序:而如果使用非递归的做法,虽然也能写出相应的代 ...

最新文章

  1. 什么是JAVA内容仓库(Java Content Repository)(3)
  2. 利用CSDN将图片自动存入AI Studio :pic2bml
  3. Ansible 入门案例
  4. JS遮罩插件 -- JqLoad
  5. 【BZOJ4262】Sum 单调栈+线段树
  6. TS 188字节流结构图
  7. oracle触发器无效且,oracle创建触发器成功但是插值失败
  8. 4星|《疯狂的独角兽》:离职员工披露上市公司负面资料,以为是小说,搜索后发现是真事。...
  9. 简单读取winfrom资源文件
  10. Matlab二元函数图像绘制
  11. 计算机网络中的猫,猫(调制解调器)和路由器有什么区别和功能?
  12. 手写文字怎么识别,手写文字识别的方法
  13. 用python3根据配置自动生成自定义图片logo(一键解决图片侵权困扰)
  14. executeUpdate()和execute()的区别
  15. NTP DDoS反射放大攻击实验
  16. DownloadString”时发生异常:“基础连接已经关闭: 发送时发生错误
  17. 「网络流 24 题」太空飞行计划
  18. 三十一、Fluent空化模型
  19. linux tail 命令详解,Linux下如何使用tail命令指南
  20. Ehcache3 入门

热门文章

  1. 人脸识别翼闸使用规范_人行通道闸如何搭配人脸识别使用
  2. fastdfs笔记_fastDFS 命令笔记-阿里云开发者社区
  3. 明日之后怎么跳过实名认证_明日之后新手教程能不能跳过 明日之后新手教程玩法介绍...
  4. python穷举法搬砖_python 穷举法 算24点(史上最简短代码)-阿里云开发者社区
  5. ppt复制切片器_这6个新手必学的PPT技能,让你效率提升10倍!套模板都比别人快...
  6. axios delete有请求体吗_关于axios请求——delete方法
  7. Python面向对象中:__init__() 构造方法
  8. 【Python学习教程】:装饰器的详细教程,通俗易懂
  9. python教程:super()的用法
  10. matlab输入数组出曲线,用鼠标画出曲线,并将曲线所经过的点保存到数组中