二叉树知识

在这里插入图片描述
1、二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)

DFS深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止。然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止。利用数据结构“栈”,父节点入栈,父节点出栈,先右子节点入栈,后左子节点入栈。递归遍历全部节点。

 DFS:ABDGCEFH

BFS广度优先遍历:从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树的层次。利用数据结构“队列”,父节点入队,父节点出队列,先左子节点入队,后右子节点入队。递归遍历全部节点。

 BFS:ABCDGEFH

2、满二叉树
高度为h,由2^h-1个节点构成的二叉树称为满二叉树。
在这里插入图片描述

3、完全二叉树
完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
在这里插入图片描述

4、二叉搜索树
二叉搜索树(又叫二叉查找树),它是具有下列性质的二叉树:
若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
左、右子树也分别为二叉搜索树。
在这里插入图片描述

总之:二叉搜索树中,左子树都比其根节点小,右子树都比其根节点大,递归定义。
重点来了!二叉搜索树的中序遍历一定是从小到大排序的。
在最好的情况下,二叉搜索树的查找效率比较高,是 O(logn),其访问性能近似于二分法;
但最差时候会是 O(n),比如插入的元素是有序的,生成的二叉搜索树就是一个链表,树的一条腿特变长,这种情况下,需要遍历全部元素才行(见下图 b)。

如果我们可以保证二叉搜索树不出现上面提到的极端情况(插入的元素是有序的,导致变成一个链表),就可以保证很高的搜索效率了。
但这在插入有序的元素时不太好控制,按二叉排序树的定义,我们无法判断当前的树是否需要调整。
因此就要用到平衡二叉树(AVL )了。

5、平衡二叉树
平衡二叉树的提出就是为了保证树不至于出现二叉查找树的极端一条腿长现象,尽量保证两条腿平衡。因此它的定义如下:
定义:平衡二叉树要么是一棵空树,要么保证左右子树的高度之差不大于 1,并且子树也必须是一棵平衡二叉树。
在这里插入图片描述
平衡二叉树的性能:

平衡二叉树在添加和删除时需要进行复杂的旋转保持整个树的平衡,最终,插入、查找的时间复杂度都是 O(logn),性能已经相当好了。
著名的红黑树就是一种平衡二叉树!

7、红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 [2]
红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

堆一般都是用完全二叉树来实现的。

部分参考自:https://zhuanlan.zhihu.com/p/106828968?utm_source=qq

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值