本期来一期对各类树的概念扫盲,建立对主流的几种树的基本的认识;
本篇的核心主线为:如何更快的操作(增删改查)一条数据?能不能更快?再快,如何最快?看到最后,你如果理解了为什么下面的各类树结构会越来越快的话,基本就掌握到窍门了,可以投身实战了;(本篇阅读需要耐心慢慢看)
本期脑图:
在没有了解这些数据结构之前,我们想要查找一个数据通过什么方式?
遍历:就是一个一个找,想不想更快?二叉查找树满足你!
1.二叉查找树:
二叉查找树(Binary Search Tree),有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),都是一个东西,是指一棵空树或者具有下列性质的二叉树:
1.在节点不为空的基础上,左子树上所有结点的值均小于它的根结点的值;右子树上所有结点的值均大于它的根结点的值;
2. 任意节点的左、右子树也分别为二叉查找树。
说人话:右边的数据比左边数据大;
No图No BB,如图:
在以上保证有序的基础上,查找操作就不需要一个一个的遍历,每次都可以经过判断过滤掉一半的数据,速度会更快!
但是各位伙计看一下上图的插入操作,如果刚好不幸,连续插入5个数字:9,10,11,12 ,13 会变成什么样子?
会变成“大长腿”,那假如查找的数据刚好是13,在大长腿的最后位置,和链表遍历就没差别了,怎么解决这个问题呢?
AVL树满足你:(不能去掉 L哈)
2.AVL树(平衡二叉查找树)
AVL树本质上还是一棵二叉搜索树,它的特点是:
1.本身首先是一棵二叉搜索树。
2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最 多为1。
说人话:AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。在插入或删除节点操作后,AVL树会根据自身规则适当左旋或者右旋来保持左右子树的高度之差的绝对值(平衡因子)最多为1的平衡;
如图:
关于插入或删除操作相关的左旋以及右旋操作,会相对复杂:
如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡,这种失去平衡的二叉树可以概括为四种姿态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。它们的示意图如下:
--------------------------------------------
友好提示:接下来关于AVL树的左旋右旋会有一点晦涩难懂,可以选择直接跳