一,树
1,什么是树
树类似于家谱或者企业里的职级关系,树是一种非线性数据结构。
树(tree)是n(n>=0)个节点的有限集,当N=0时,称为空树。有如下两个特点:
1.有且仅有一个特定的称为根的节点。
2.当N>1时,其余节点可分为m(M>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。
在上图中5是根节点,1,3,7是树的末端,2,8又是5的子树。树的结构从根节点到叶子节点,分为不同的层级。
树的最大层级数,被称为树的高度或者深度。显然上图的树的高度是3.
二,二叉树
二叉树是一种特殊的树,它的每个节点最多有2个孩子节点。
二叉树还有两只特殊形式,一个叫做满二叉树,另一个叫做完全二叉树。
定义:一个二叉树的所有非叶子节点都存在左右孩子,并且所有叶子节点都在同一层级上,那这个二叉树就是满二叉树。
定义:对一个有N个节点的二叉树,按层级顺序编号,则所有节点的编号从1到n,如果这个树的所有节点和同样深度的满二叉树的编号从1到n的节点位置相同,则这个二叉树为完全二叉树。如上图,编号按顺序进行排列。
完全二叉树的条件没有满二叉树的严格,满二叉树要求所有分支都是满的。而完全二叉树只需要保证最后一个节点之前的节点都是齐全即可。
三,二叉树的存储
1,链式存储结构
2,数组
链式存储是最直观的一种方式,如笔记一种所说链表的每一个链表节点拥有data变量和一个指向下一个节点的next指针。而二叉树的更复杂一些,一个节点最多可指向两个孩子节点,所以二叉树的每一个节点分为三部分:
1,存储数据的data变量。
2,指向左孩子的左指针。
3,指向右孩子的右指针。
数组存储时,会按照层级顺序把二叉树的节点放到数组种对应的位置上。如果某一个节点上的左孩子或者空缺,则在数组上的位置将相应的位置空缺出来。
此时,假设父节点的下标时parent,则左孩子的下标为2parent+1,右孩子的节点为2parent+2.
反过来,假设一个左孩子节点的下标时leftchild,则它的父节点的下标时(leftchild-1)*2。
如上图完全二叉树中,节点4的下标是3,则它的父节点2的下标就是=(3-1)/2=1。所以节点2的下标为1.
四,二叉树的应用
二叉树最主要的应用在于进行查找操作和维持相对顺序这个两个方面。
1.查找
二叉查找树
条件:
如果左子树不为空,则左子树上的所有节点的值均不小于根节点的值
如果右子树不为空,则右子树上的所有节点的值均大于根节点的值
左、右子树也是二叉查找树
比如:
查找值为4的节点,步骤如下
1,访问根节点6,发现4<6;
2,访问节点6的左孩子节点3,发现4>3;
3,访问节点3的右孩子节点4,发现4=4,结束。
对于一个节点分布相对均衡的二叉查找树,如果节点总数是N,那么搜索节点的时间复杂度就是o(logn),和树的深度是一样的。
2,维持相对顺序
二叉查找树要求左子树小于父节点,右子树大于父节点,正是这样保持了二叉树的有序性。因此又叫二叉排序树。
新插入的节点,同样要遵循二叉排序树的原则,比如上图插入新元素5,由于5<6,5>3,5>4,所以5最终会插入到节点4的右孩子的位置。
本章到此记录结束,日积月累。明天继续学习二叉树的遍历。