前言
自考学习如火如荼进行着,看书,画导图,做题,讨论,小组学习的热情依然是我们自考学习中的强心针。上次博客简单总结了下老师对于数据库结构导论的学习方法。本篇博客简单总结了,二叉树的相关知识,希望能给读者带来收获。下图是二叉树知识点思维导图。
基本概念
二叉树(Binary Tree)是n个元素的有限集合,该集合或者为空,或者由一根及两根互不相交的左子树和右子树组成,其中左子树和右子树也均为二叉树。
二叉树的任一一个结点都有两棵子树,两棵子树之间是有次序关系的,左右子树分别成为该结点的左孩子和右孩子。
二叉树有五种基本形态。如下图所示(方块代表的是子树)分别为空二叉树,左右子树均为空的二叉树,右子树为空的二叉树,左子树为空的二叉树,左右子树都为非空的二叉树。
性质
二叉树的5个性质,在做题过程中遇到的比较频繁,性质是重点哦~
NO.1二叉树第i(i>=1)层上至多有 2 的i-1次方个结点。
NO.2深度为k(k>=1)的二叉树至多有 2的k次方-1个结点。
NO.3对任何一棵二叉树,若度数为0的结点(叶结点)个数为n0,度数为2的结点个数为n2,则n0=n2+1。
NO.4 含有n个结点的完全二叉树的深度为log以2为底n的对数加 1。
NO.5 如果将一棵有n个结点的完全二叉树按层编号。对任一编号为i的结点A有:
(1)若i=1,则结点A是根;若i>1,则A的双亲Parent(A)的编号为[i/2];
(2)若2*i>n,则结点A既无左孩子,也无右孩子;否则A的左孩子Lchild(X)的编号为2*i
(3)若2*i+1>n,则结点A无右孩子;否则,A的右孩子Rchild(A)的编号为2*i+1
满二叉树:深度为k(k>=1)且有2的k次方减1个结点的二叉树成为满二叉树。结合性质2,满二叉树的结点数已经达到了二叉树可以容纳的最大值。
完全二叉树:如果对满二叉树按从上到下,从左到右的顺序编号,并在最下一层删去部分结点(删后最后一层仍有结点),如果删除的这些结点的编号是连续的且删除的结点中含有最大编号的结点,那么这棵二叉树就是完全二叉树。如下图:
下面的两个例子,就是非完全二叉树。
从上面定义我们可知,满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
链式存储
在二叉链表中,data域用于存储二叉树结点中的数据信息,lchild是指向左孩子的指针,rchild是指向右孩子的指针。每个二叉树表还必须有一个指向根结点的指针。该指针成为根指针。
下图是二叉链表的结点结构:
二叉树对应的二叉链表示意图:
Tip:如果二叉树为空,则root=NULL。若某结点的某个孩子不存在,则相应的指针为空,具有n个结点的二叉树中,有2n个指针域,其中只有n-1个用来指向结点的左、右孩子,其余的n+1个指针域为NULL。
遍历
二叉树的遍历是指按照某种次序访问二叉树上所有结点,使每个结点被访问一次且仅被访问一次。
按照某种次序执行下面三步,就可以遍历整个二叉树。
1.访问根节点。
2.遍历根左子树(依次访问左子树上全部)
3.遍历根的右子树(一次访问右子树上的全部结点)
*递归实现遍历有先序,中序,后序三种次序。
先序遍历:访问根结点——>先序遍历左子树——>先序遍历右子树
中序遍历:中序遍历左子树——>访问根结点——>中序遍历右子树
后序遍历:后序遍历左子树——>后序遍历右子树——>访问根结点
*层次遍历就是从二叉树的根结点这一层开始,逐层向下遍历,在每一层上按从左到右的顺序对结点逐个访问。
小结
本篇博客介绍了二叉树的概念,5个重要的性质,链式存储,遍历等知识,希望能给读者带来一些收获~~谢谢阅读~