二叉树及二叉树遍历的基础解读

简介: 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 。

前言


二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 。


2、二叉树定义


二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。


3、二叉树的五种基本形态


1、空二叉树——如图1(a) ;

2、只有一个根结点的二叉树——如图1(b);

3、只有左子树——如图1(c) ;

4、只有右子树——如图1(d) ;

5、完全二叉树

eacc140e7b1b96edf6b5369ac7ff7b5.png

满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树


4、相关术语


①结点:包含一个数据元素及若干指向子树分支的信息。

②结点的度:一个结点拥有子树的数目称为结点的度。

③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。

④分支结点:也称为非终端结点,度不为零的结点称为非终端结点。

⑤树的度:树中所有结点的度的最大值。

⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层。

⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。

⑧有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树。

⑨无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树。

⑩森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成。


5、二叉树性质


性质1:二叉树的第i层上至多有2i-1(i≥1)个节点。

性质2:深度为h的二叉树中至多含有2h-1个节点。

性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。

性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。

性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:

当i=1时,该节点为根,它无双亲节点。

当i>1时,该节点的双亲节点的编号为i/2。

若2i≤n,则有编号为2i的左节点,否则没有左节点。

若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。


6、二叉树遍历

一棵二叉树由根结点、左子树和右子树三部分组成,若规定 D、L、R 分别代表遍历根结点、遍历左子树、遍历右子树,则二叉树的遍历方式有 6 种:DLR、DRL、LDR、LRD、RDL、RLD。由于先遍历左子树和先遍历右子树在算法设计上没有本质区别,所以,只讨论三种方式:


6.1、DLR–前序遍历(根左右)

根在前,从左往右,一棵树的根永远在左子树前面,左子树又永远在右子树前面 。


6.2、LDR–中序遍历(左根右)

根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面。


6.3、 LRD–后序遍历(左右根)

根在后,从左往右,一棵树的左子树永远在右子树前面,右子树永远在根前面。


前序遍历(DLR):

5272e9058ebb46c3805b7c8e897505c1.png

中序遍历(LDR):

92ef194e73c4433dbd9d1ccfb8d5f9de.png

后序遍历(LRD):

c928f2692b714de49b054e2164b99be7.png


* 中序投影法

计算中序遍历拥有比较简单直观的投影法,如图


55f147a7ab3746df9e6f1c8cd72a06ae.png

7、层序遍历

除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。


8、实例:

二叉树的先序遍历是:ABDEGCFH 中序遍历是:DBGEACHF,请写出这个二叉树的后序遍历结果。


答:

方法一、先序+中序遍历还原二叉树,文字解读:


1)首先从先序得到第一个为A,就是二叉树的根,回到中序,可以将其分为三部分:

左子树的中序序列DBGE,根A,右子树的中序序列CHF。

2)接着将左子树的序列回到先序可以得到B为根,这样回到左子树的中序再次将左子树分割为三部分:

左子树的左子树D,左子树的根B,左子树的右子树GE

3)同样地,可以得到右子树的根为C

类似地将右子树分割为根C,右子树的右子树HF,注意其左子树为空

如果只有一个就是叶子不用再进行了,刚才的GE和HF再次这样运作,就可以将二叉树还原了。


方法二:中序投影法

前序(根左右):A B D E G C F H


dbf06c5786eb4e2e8e9e5eb6b0e33281.png

**结果:**后序(左右根):D G E B H FCA

思路:

先用中序投影法,将结点投影到一条线上。然后利用二叉树原理,根据前序排列绘制出二叉树的结果。


参考:

1、二叉树-百科

2、二叉树遍历-百科

3、二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解


大神精论:

1、深入学习二叉树(一) 二叉树基础


相关文章
|
7月前
|
存储 算法
【C/数据结构与算法】:树和二叉树
【C/数据结构与算法】:树和二叉树
47 0
|
7月前
|
存储 算法
数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)
数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)
29 0
|
8月前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
8月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
173 0
|
8月前
|
存储 算法 Java
详细谈谈二叉树的层次遍历
详细谈谈二叉树的层次遍历
77 0
|
算法 C语言
【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)
文章目录 一、二叉树的深度优先遍历 🌺1.前序遍历 (1)`先序遍历`的过程: (2)流程图: (3)代码: (4)测试结果: 🌼2.中序遍历 (1)`中序遍历`的过程: (2)代码: (3)测试结果: 🌻3.后序遍历
|
存储 算法 前端开发
前端算法-前序遍历二叉树
前端算法-前序遍历二叉树
|
存储 C++
井号法(#)创建二叉树(利用前序遍历来建树)C++实现
井号法(#)创建二叉树(利用前序遍历来建树)C++实现
176 0
井号法(#)创建二叉树(利用前序遍历来建树)C++实现
【笔记14】树的基本概念,二叉树,真二叉树,满二叉树,完全二叉树
节点、根节点、父节点、子节点、兄弟节点 空树:没有任何节点的树 一棵树可以只有 1 个节点(即只有根节点) 子树、左子树、右子树
261 0
【笔记14】树的基本概念,二叉树,真二叉树,满二叉树,完全二叉树
|
算法
数据结构:根据二叉树先序遍历和中序遍历求后序遍历序列。(这大概是最简单的方法,不服来评论)
数据结构:根据二叉树先序遍历和中序遍历求后序遍历序列。(这大概是最简单的方法,不服来评论)
143 0