开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
1、写在前面
大家好,今天文章的内容是:
- 二叉树的基础知识
2、内容
2.1、种类
(1) 满二叉树
如果在一个二叉树中,只有度为0和度为2的结点,并且度为0的结点都在同一层,任意层次的结点个数都达到了最大值,我们将这样的二叉树称为满二叉树。
比如:
如果满二叉树的某一层的深度为,则该层应有个结点。
(2) 完全二叉树
如果在一个二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最底层的结点都集中在该层最左边的连续位置上。那么我们就称这个二叉树为完全二叉树。
比如:
(3) 二叉搜索树
二叉搜索树是一种有序树,其定义如下:
- 若它的左子树不空,则左子树上所有结点的值都小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值都大于它的根结点的值;
- 左、右子树都分别是二叉搜索树
比如:
(4) 平衡二叉搜索树
如果在一颗二叉树中,左右子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树,那么我们称这个二叉树为平衡二叉搜索树,又称AVL(Adelson-Velsky and Landis)树。
比如:
2.2、存储结构
(1) 顺序存储
顺序存储的方式就是用数组,其存储的元素在内存是连续分布的
比如上述二叉树就可以用一个数组来表示,如下所示:
二叉树之所以可以用数组来存储,是因为二叉树的性质:
如果对一颗有个结点的完全二叉树按层次自上而下(每层从左到右)对结点进行编号(从到),则对任意结点而言:
- 如果结点的编号等于,则结点为根结点(没有父结点)
- 如果大于,则该结点的父节点编号为
- 如果小于或等于,则的左孩子的编号为,否则无左孩子
- 如果小于或等于,则的右孩子的编号为,否则无右孩子。
如上图所示,完全二叉树中有9个结点,即。举个例子,比如编号为4的结点为,又因为 ,即,所以结点的左孩子的编号为(也就是),可以观察到,上图中结点 的左孩子确实是。
像这样,从上而下,从左到右地将二叉树的结点存储下来,并利用二叉树性质,就可以轻松地体现二叉树各个结点之间的逻辑关系。这就是二叉树的顺序存储结构。
(2) 链式存储
当我们采取链式存储结构来存储二叉树时,每个结点除了存储数据元素本身的值data外,还需要设置两个指针,分别用于指向左、右子树。当任意结点的某个子树为空时,对应的指针就可以设置为NULL
2.3、遍历运算
掌握二叉树的遍历运算也很重要,对于二叉树而言,遍历运算主要分为两种:深度优先遍历(先往深走,遇到叶子节点再往回走)和广度优先遍历(一层一层的去遍历)。
比如,现在有一颗二叉树如下图所示:
那么有如下遍历方式:
(1) 深度优先遍历
- 前序遍历:[]
- 中序遍历:[]
- 后序遍历:[]
(2) 广度优先遍历
- 层次遍历:[]
3、写在最后
好了,文章的内容就到这里,感谢观看。