第一次写的代码备份:
1. 概念
二叉搜索树,BST(Binary Search Tree),即为特殊的二叉树。
以根节点为例,左子树中所有的值均小于根节点;右子树中所有的值均大于根节点。此结论对于任意节点有效。
二叉搜索树,为有序树。按照中序遍历的方式(左 - 中 - 右)得到的序列为从小到大的有序序列。
因此,最左侧的叶子节点为最小元素,左右侧的节点为最大元素。
2. 操作
2.1 二叉搜索树的创建及节点插入
二叉搜索树的创建过程,就是依次按需插入节点的过程。
整体插入过程类似于折半查找的分治思想:第一个插入的节点作为标识,小于的节点插入到左子树中,大于的节点插入到右子树中。然后每个节点上均递归此过程。
我们先创建二叉树的节点,创建过程如下:
|
|
插入节点的实现如下:
|
|
创建二叉搜索树的过程,即依次插入节点:
|
|
简单调用:
|
|
执行结果:
AlgorithmLearning[25055:10245382] 2 11 22 34 45 998
AlgorithmLearning[25055:10245382] 0 2 11 22 34 45 998
由此也可以看出,创建二叉查找树的过程,也是对数组进行排序的过程(需要按照中序遍历输出)。
2.2 二叉搜索树的节点删除
从二叉搜索树中删除节点的要求,是不能破坏二叉树的整体结构(中序遍历出的结果仍然有序)。
可以通过修改节点数据或移除节点的方式进行。
首先,我们可以将删除的节点进行分类:
- 删除的节点为叶子节点,没有左右子树;
- 删除的节点为根节点,只有右子树;
- 删除的节点为根节点,只有左子树;
- 删除的节点为根节点,包含左右子树。
解法:
- 对于没有左右子树的叶子节点,删除时,只要将其父节点的对应子节点置为NULL即可;(可以理解为单链表尾部节点的删除)
- 对于只有右子树的节点来说,删除时,只要将其父节点对应的右子节点设置为删除节点的右节点即可;(可以理解为单链表中间某节点的删除)
- 对于只有左子树的节点来说,删除时,只要将其父节点对应的左子节点设置为删除节点的左节点即可;(同上)
- 对于同时包含左右子树的节点,删除情况要复杂一些:
删除时,由于所有左节点均小于删除节点,因此,需要找一个大于所有左子树节点(大于左子节点即可),同时又是右子树中最小的节点即可。因此,只要选定待删除节点的右子树中,最左边的节点进行覆盖即可(没有则直接将待删节点的右节点提上即可)。
这里,需要两个额外功能,
- 在二叉查找树中,查找指定节点:
|
|
- 在二叉树中,查找指定节点的父节点:
|
|
删除子节点的实现如下:
|
|
注:注释代码为更简略实现。
测试如下:
|
|
执行结果:
AlgorithmLearning[26968:10339083] 1
AlgorithmLearning[26968:10339083] 0 2 11 22 34 45