版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/99687256
一、计算机科学中的树
![96fa72fbd21ee2663ae0f388e9baa037.png](https://img-blog.csdnimg.cn/img_convert/96fa72fbd21ee2663ae0f388e9baa037.png)
二、二叉树的定义
一棵树,它的每个节点最多只能有两个子节点,此时就叫二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。如果节点多于两个,我们也称之为多路树)
![411a77aa2f0a5e092a4b2cedad3415e8.png](https://img-blog.csdnimg.cn/img_convert/411a77aa2f0a5e092a4b2cedad3415e8.png)
![1532f0a2a8ccfa9376dfb5033bdbac57.png](https://img-blog.csdnimg.cn/img_convert/1532f0a2a8ccfa9376dfb5033bdbac57.png)
![c657c427733b911bcd9bba3e9ff98a55.png](https://img-blog.csdnimg.cn/img_convert/c657c427733b911bcd9bba3e9ff98a55.png)
可以看出: 满二叉树一定是完全二叉树;完全二叉树不一定是满二叉树。
如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉查找树(binary search tree)的特殊二叉树。
二叉查找树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。【左边下边小,右边上边大】
![941c8c622703742c665e2572e559724b.png](https://img-blog.csdnimg.cn/img_convert/941c8c622703742c665e2572e559724b.png)
三、二叉查找树的日常操作
PS:二叉树很多,但对我们来说,在实际的应用中,二叉排序树的应用比较多。1.插入新节点
假设我们要为数组 a[] = {10 , 5 , 15 , 6 , 4 , 16 }构建一个二叉排序树,我们按顺序逐个插入元素。
![76491bece59dd8de38b0ba537a1de338.png](https://img-blog.csdnimg.cn/img_convert/76491bece59dd8de38b0ba537a1de338.png)
插入过程是这样的:
如果是空树,则创建一个新节点,新节点作为根,因此以元素10构建的节点为该二叉查找树的根。
- 插入5,5比10小,与10的左孩子节点进行比较,10的左孩子节点为空,进行插入。
- 插入15,15比10大,与10的右孩子节点进行比较,10的右孩子节点为空,进行插入。
- 插入6,6比10小,与10的左孩子节点5比较;6比5大,与5的右孩子节点进行比较,5的右孩子为空,进行插入。
- 插入4,4比10小,与10的左孩子节点5比较;4比5小,与5的左孩子节点进行比较,5的左孩子为空,进行插入。
- 插入16,16比10大,与10的右孩子节点15比较;16比15大,与15的右孩子节点进行比较,15的右孩子为空,进行插入。
从这个过程我们可以总结出插入新元素的步骤:
- 寻找元素合适的插入位置:新元素与当前结点进行比较,若值大于当前结点,则从右子树进行寻找;否则从左子树进行寻找.
- 找到插入位置之后,以元素的值构建新节点,插入二叉排序树中。
2.遍历平衡二叉树
【百度百科】平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
![620ffd80c79390cb0e16280713fac6dd.png](https://img-blog.csdnimg.cn/img_convert/620ffd80c79390cb0e16280713fac6dd.png)
遍历平衡二叉树,就是以某种方式逐个“访问”二叉树的每一个节点。举例说明:
![e9c6c56eb5507e206be95c03b00032c9.png](https://img-blog.csdnimg.cn/img_convert/e9c6c56eb5507e206be95c03b00032c9.png)
前序遍历
- 访问根结点中的数据
- 前序遍历左子树
- 前序遍历右子树
前序遍历结果:
1, 2, 4, 8, 9, 5, 10, 3, 6, 7
中序遍历
- 中序遍历左子树
- 访问根结点中的数据
- 中序遍历右子树
中序遍历结果:
8, 4, 9, 2, 10, 5, 1, 6, 3, 7
后序遍历
- 后序遍历左子树
- 后序遍历右子树
- 访问根结点中的数据
后序遍历结果:
8, 9, 4, 10, 5, 2, 6, 7, 3, 1
层次遍历
- 访问根结点中的数据
- 访问第二层所有结点的数据
- 访问第三层所有结点的数据
- ……
层次遍历结果:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
3.删除节点
删除二叉排序树的某个节点有三种情况:
- 被删除节点同时有左子树与右子树。将前驱节点的值保存在当前结点,继而删除前驱节点。
- 被删除节点只有左子树或只有右子树。直接用子树替换被删节点。
- 被删除节点没有子树。可以直接删除节点。
![2fa740c8ea6185dd94d41970938a090d.png](https://img-blog.csdnimg.cn/img_convert/2fa740c8ea6185dd94d41970938a090d.png)
4.查找最值元素
二叉排序树的最小值位于其最左节点上;最大值位于其最右节点上
![ea46bde75941c88375854569a37bebb8.png](https://img-blog.csdnimg.cn/img_convert/ea46bde75941c88375854569a37bebb8.png)
我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!
![886de73118a3e72a9ba4e5b40a10d245.png](https://img-blog.csdnimg.cn/img_convert/886de73118a3e72a9ba4e5b40a10d245.png)
四、参考资料https://blog.csdn.net/wannuoge4766/article/details/83998377https://www.cnblogs.com/shixiangwan/p/7530015.htmlhttps://www.cnblogs.com/ysocean/p/8032642.htmlhttps://blog.csdn.net/u014634338/article/details/42465089http://www.it610.com/article/3607922.htm