背景:
最近我要学习二叉平衡树了,在学习二叉平衡树之前,我需要学会二叉搜索树,因为二叉平衡树就是根据二叉搜索树的思想进行优化的。
二叉查找树简介:
二叉查找树是什么呢?(也叫二叉搜索树)就是字面意思,首先是一颗二叉树:一棵树,最多分两个叉。
![](https://i-blog.csdnimg.cn/blog_migrate/9db9596c5ab3096a10b407b9eeac6bb0.png)
上面那个图就是一颗二叉树,同时也是一颗满二叉树:每一个节点都有两个儿子,左儿子和右儿子。
同时啊,还有完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
![](https://i-blog.csdnimg.cn/blog_migrate/ff40782d24198eddbad68120ac7539cd.png)
然后最后一张图,就是普通的二叉树(就是只有每一个结点最多有两个儿子这一个特性):
![](https://i-blog.csdnimg.cn/blog_migrate/0ad7f6b2aa569c000619e3af8c20b11c.png)
然后,我们在看“搜索”,也就是说,我们建立起来的这颗二叉树,是用来搜索的,我们知道,搜索有很多种算法都可以,二分查找,枚举查找,启发式查找,为什么要用感觉很复杂的二叉树进行查找呢?那肯定是因为用二叉查找树来搜索比这些算法都快呀!
接下来,给大家说一下二叉查找树的定义:一棵二叉树(满二叉树,完全二叉树,普通二叉树都可以),从根节点开始,根节点的左儿子一定小于根节点,根节点的右儿子肯定大于根节点,根节点的左儿子的左儿子也是一样,小于根节点的左儿子,根节点的左儿子的右儿子一定大于根节点的左儿子,以此类推,除了叶子节点,其他节点必须满足这个要求(等于的话算右儿子)
也就是说,一棵二叉搜索树的所有左子节点肯定都小于根节点,所有的右子节点肯定都大于等于根节点,这样做有什么好处呢?首先,我们想要在二叉搜索树里查找一个数,首先比较第一个数与根节点的大小,如果一样,那就找到了,如果小于,那么前往左儿子那里继续重复这样的操作找,如果大于,那就前往右儿子那里继续重复这样的查找,直到找到为止。如果到了叶子节点,都没有找到这个数,那么在二叉搜索树里面就没有这个数。
叶子结点就是一个没有左儿子和没有右儿子的结点(比方说上图1.3图中的4,8,9,6,10号结点就都是叶子结点)。
![](https://i-blog.csdnimg.cn/blog_migrate/a859cef4beb2023b520af69718176d8b.png)
以上这个图就是一棵二叉搜索树,每一个结点都符合左儿子小于结点,右儿子大于结点这一个条件,看上面这个数,是我们输入9个数之后建成的,如果用数组进行查找的话,最快需要1次,最久需要9次才可以找到,而这个二叉搜索树