二叉树的存储,遍历和基本操作

目录

二叉树的存储

二叉树的遍历

1.前序遍历

2.中序遍历

3.后序遍历

4. 层序遍历

二叉树遍历操作的递归实现

二叉树的基本操作

1.计算二叉树节点的个数

2.获取叶子节点的个数

3. 求第k层节点的个数

4.求二叉树的高度

5.检测值为value的值是否存在


二叉树的存储

二叉树的存储结构分为:顺序存储类似于链表的链式存储

在这一章我主要讲二叉树的链式存储,顺序存储会在下一篇文章中讲到

链式存储

二叉树的链式存储时通过一个一个节点引起来的,常见的方式有二叉和三叉的表示方法

二叉表示法:

二叉树的存储,遍历和基本操作_第1张图片

三叉表示法:

二叉树的存储,遍历和基本操作_第2张图片在学习二叉树的基本操作之前先用孩子便是法来创建一颗二叉树。创建如下

二叉树的存储,遍历和基本操作_第3张图片

二叉树的存储,遍历和基本操作_第4张图片


二叉树的遍历

所谓遍历就是沿着某条搜索路线,依次对树中每个节点做且仅做一次访问。根据二叉树的结构特点,可以将二叉树划分为三个部分,根节点,左子树和右子树。其次,二叉树有层次之分,对于一颗二叉树来说,他有三条搜搜路径,封面别是先上后下,先左子树后右子树,先右子树后左子树。根据这种思路我讲四种遍历方法。我用下面这颗二叉树讲解。

二叉树的存储,遍历和基本操作_第5张图片

1.前序遍历

若二叉树为空,则为空操作,否则:

(1)访问根节点

(2)在遍历左子树

(3)然后遍历右子树

遍历顺序: 

先遍历根节点A------>

遍历A节点的左子树-

遍历B

遍历B的左子树 

遍历D

D的左子树和右子树都为空

遍历B的右子树

B的右子树为空

遍历A的右子树

遍历C

遍历C的左子树

遍历F

遍历F的左子树

F的左右子树为空

遍历C的右子树

遍历G

G的左右子树都为空

遍历完成。

我把每个节点都看作一颗二叉树,每棵树都有根节点,左子树和右子树,把每棵树的根 左,右遍历完成接着遍历下一个节点

遍历顺序

A  B  D  C   F  G

2.中序遍历

若二叉树为空,则为空操作,否则:

(1)中根遍历左子树

(2)访问根节点

(3)中根遍历右子树

遍历顺序: 

遍历A节点的左子树B

遍历B的左子树 D

D的左子树为空,返回

访问D

遍历D的右子树发现为空,返回

访问B

遍历B的右子树发现为空,返回

访问根节点A

遍历A的右子树C

遍历C的左子树F

遍历F的左子树 为空,返回

访问F

F的左右子树为空,返回

访问C

遍历C的右子树

G的左右子树都为空,返回

访问G

遍历完成。

遍历顺序

D  B   A    F   C  G

3.后序遍历

若二叉树为空,则为空操作,否则:

(1)后根遍历左子树

(2)后根遍历右子树

(3)访问根节点

遍历顺序:

遍历A的左子树

遍历B的左子树

遍历D的左子树

D的左右子树都为空 

访问D

遍历B的右子树 为空

访问B

遍历A的右子树

遍历C的左子树

遍历F的左子树 ,右子树都为空

访问F

遍历C的右子树,

遍历G的左右子树都为空 

访问G

访问C

访问A

遍历完成

遍历顺序

D  B  F  G  C  A

4. 层序遍历

先访问第0层的根节点,然后从左但右依次访问第1层的每一个节点,依次类推,直到左后一层的所有节点都被访问完为止。

遍历顺序

A     B     C    D     F     G

二叉树遍历操作的递归实现

前序遍历

二叉树的存储,遍历和基本操作_第6张图片

中序遍历

二叉树的存储,遍历和基本操作_第7张图片

后序遍历

二叉树的存储,遍历和基本操作_第8张图片


二叉树的基本操作

二叉树的遍历操作是实现对二叉树其他操作的一个重要基础,利用二叉树的遍历方法可以解决二叉树的很多问题。下面给出几个典型的二叉树遍历操作问题及其实现方法。都采用递归的方法。

1.计算二叉树节点的个数

二叉树的存储,遍历和基本操作_第9张图片

由于二叉树中节点的个数等于1个根节点在加上它的左右子树中节点的个数。当遍历到叶子节点的时候, root.left和root.right 为null,此时递归调用size(TreeNode root). leftSize和rightSize都为0,则leftSize + rightSize + 1 = 1.


2.获取叶子节点的个数

二叉树的存储,遍历和基本操作_第10张图片

1. 当root == null的时候 叶子节点的个数为0

2. 当前节点的左子树和右子树都为空的时候,当前节点是根节点,则返回1.

3. 采用递归的思想,先遍历左子树在遍历右子树,然后将叶子节点数相加。

3. 求第k层节点的个数

二叉树的存储,遍历和基本操作_第11张图片

1. 当root == null的时候 第k层节点的个数为0

2. 要求第k层节点的个数,操用递归的思想,每递归一次,k-1,当k == 1的时候就是我们要求的第k层的节点数

3. 先遍历左子树k层节点在遍历右子树k层节点,相加为总节点数。

4.求二叉树的高度

二叉树的存储,遍历和基本操作_第12张图片

遍历这棵二叉树,求出左子树的高度和右子树的高度,进行比较,返回高度较高的子树 + 1

5.检测值为value的值是否存在

二叉树的存储,遍历和基本操作_第13张图片

1. 当root == null的时候 不存在节点则为null

2. 先遍历左子树,若没有找到返回null,否则返回该节点

3. 若左子树没有找右子树,,若没有找到返回null,否则返回该节点。

4.若整棵二叉树都遍历完了还没有找到,则返回null

你可能感兴趣的:(Java数据结构,数据结构)