数据结构与算法学习——树结构及二叉树的认识

树结构和数组/链表/哈希表的对比有什么优点?

数组:

优点:
数组的主要优点是根据下标值访问效率会很高
但是如果我们希望根据元素来查找对应位置呢?
比较好的方式是先对数组排序,再进行二分查找
缺点:
需要先对数组进行排序,生成有序数组,才能提高查找效率
另外数组在插入和删除时,需要大量位移操作,效率很低

链表:

优点:链表插入和删除操作效率都很高
缺点:查找效率很低,需要从头开始依次访问链表中的每个数据项,直到找到,而且即使插入和删除效率很高,但是如果插入和删除中间位置的数据,还是需要重头先找到对应数据再进行操作。

哈希表:

优点:
我们学过哈希表后,已经发现哈希表的插入/查询/删除效率都非常高
缺点:
空间利用率不高,底层使用的是数组,并且某些单元格没有被利用
哈希表中的元素是无序的,不能按照固定顺序来遍历哈希表中的元素
不能快速的找出哈希表中的最大值或者最小值这些特殊值。

树结构:

我们不能说树结构比其他结构都要好,因为每种数据结构都有自己特定的应用场景,但是树结构确实也综合了上面的数据结构的优点(当然优点不足于盖过其他数据结构,比如效率一般情况下没有哈希表高),并且也弥补了上面数据结构的缺点,而且为了模拟某些场景,我们使用树结构会更加方便,因为树结构是非线性的,可以表示一对多的关系,比如文件的目录结构。

树的术语:

1.节点的度(Degree):节点的子树个数
2.树的度:树的所有节点中最大的度数
3.叶节点(leaf):度为0的节点(也称为叶子节点)
4.父节点(parent):有子树的节点是其子树的根节点的父节点
5.子节点(child):若A节点为B节点的父节点,则成B节点是A节点的子节点;子节点也称孩子节点
6.兄弟节点(sibling):具有同一父节点的各节点彼此都是兄弟节点
7.节点的层次(level):规定根节点在1层,其他任一节点的层数是其父节点的层数加1
9.树的深度(Depth):树中所有节点中的最大层次是这棵树的深度

树最普通的表示方式

这种表示方式由于不知道有几个子节点 所以没有办法来定义相对的连接 比如上面的A有三个子节点 我们可以定义left指向左子节点 right指向右子节点 middle指向中间子节点 但是如果它有四个子节点甚至更多那么我们封装起来并不会这么直白的创建连接了

数据结构与算法学习——树结构及二叉树的认识_第1张图片

儿子兄弟表示法

这种方法可以轻松的解决上面的问题 只需要一个left指针和right指针就可以将树结构呈现出来

数据结构与算法学习——树结构及二叉树的认识_第2张图片

儿子兄弟表示法旋转

儿子兄弟表示法旋转将儿子兄弟表示法变成二叉树
数据结构与算法学习——树结构及二叉树的认识_第3张图片

树的种类

完美二叉树

完美二叉树也称为满二叉树
在二叉树中,出了最下一层的叶节点外,每层节点都有两个子节点,就构成了满二叉树

数据结构与算法学习——树结构及二叉树的认识_第4张图片

完全二叉树

若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。
完美二叉树是特殊的完全二叉树
下图并不是完全二叉树,因为D节点没有右节点,但是E节点就有了左右节点,解决办法:
1)增加D的右子节点 2)将9和10删掉
数据结构与算法学习——树结构及二叉树的认识_第5张图片

二叉树

二叉树概念

如果树中每个节点最多只能有两个子节点,这样的树就成为二叉树,上面我们已经提到了二叉树的重要性,不仅仅是因为简单,也因为几乎所有的树都可以表示成二叉树的形式

二叉树的定义

二叉树可以为空,也就是没有节点,若不为空,则它是由根节点和称为其左子树tl和右子树tr的两个不相交的二叉树组成

二叉树有五种形态

数据结构与算法学习——树结构及二叉树的认识_第6张图片

(a):空树
(b):只有根节点
(c):只有左子树
(d):只有右子树
(e):左右子树都存在

二叉树有几个比较重要的特性

一个二叉树第i层的最大节点数为:2^(i-1),i>=1;
如下图比如第三层最大个数 = 2^(3-1) = 2^2 = 4;那么第三层最大的节点数就为4
深度为k的二叉树有最大节点的总数为:2^k-1,k>=1;
以第四层为例,最大个数 = 2^4-1 = 16 - 1 =15;那么我们下图中的树所有节点不能超过15
对任何非空二叉树T,若n0表示叶节点的个数,n2是度为2的非叶节点个数,那么两者满足关系n0=n2+1
这里的度为2就是左右子树都存在的节点,无论怎么画这颗树叶子节点的个数都等于度为2的非叶子节点+1

数据结构与算法学习——树结构及二叉树的认识_第7张图片

二叉树的存储

二叉树的存储常见的方式是数组和链表

使用数组

完全二叉树:按从上至下,从左到右顺序存储
数据结构与算法学习——树结构及二叉树的认识_第8张图片

非完全二叉树
非完全二叉树要转成完全二叉树才可以按照上面的方案存储,但是会造成很大的空间浪费
数据结构与算法学习——树结构及二叉树的认识_第9张图片

使用链表

二叉树最常见的方式还是使用链表存储
每个节点封装成一个node,node中包含存储的数据,左节点的引用,右节点的引用
数据结构与算法学习——树结构及二叉树的认识_第10张图片

二叉搜索树

概念

二叉搜索树(BST,Binary Search Tree),也称为二叉排序树或二叉查找树
二叉搜索树是一颗二叉树,可以为空;
如果不为空,满足一下性质:
非空左子树的所有键值小于其根节点的键值。
非空右子树的所有键值大于其根节点的键值。
左,右子树本身也都是二叉搜索树。

二叉搜索树的特点

二叉搜索树的特点就是相对较小的值总是保存在左节点上,相对较大的值总是保存在右节点上,查找效率非常高,这也是二叉搜索树中搜索的来源

你可能感兴趣的:(数据结构和算法,二叉树)