二叉搜索树
1. 定义
二叉搜索树(BST)也称二叉排序树或二叉查找树
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
- 非空左子树的所有键值小于其根结点的键值
- 非空右子树的所有键值大于其根结点的键值
- 左、右子树都是二叉搜索树
2. 特殊函数
BinTree Find(ElementType X,BinTree BST)
:从二叉搜索树 BST 中查找元素 X,返回其所在结点地址BinTree FindMin(BinTree BST)
:从二叉搜索树 BST 中查找并返回最小元素所在结点的地址BinTree FindMax(BinTree BST)
:从二叉搜索树 BST 中查找并返回最大元素所在结点的地址BinTree Insert(ElementType X,BinTree BST)
:插入一个元素进 BSTBinTree Delete(ElementType X,BinTree BST)
:从 BST 中删除一个元素
1. 查找
- 查找从根结点开始,如果树为空,返回 NULL
- 若搜索树不为空,则根结点键值和 X 进行比较,并进行不同处理:
- 若 X 小于根结点键值,在左子树中继续查找
- 若 X 大于根结点键值,在右子树中继续查找
- 如 X 等于根节点键值,查找结束,返回指向此结点的指针
2. 查找最大和最小元素
-
最大元素一定是在树的最右分支的端结点上
-
最小元素一定是在树的最左分支的端结点上
3. 删除
删除的三种情况:
-
要删除的是叶结点:直接删除,并将其父结点指针置为 NULL
-
要删除的结点只有一个孩子结点:将其父结点的指针指向要删除结点的孩子结点
-
要删除的结点有左、右两棵子树:用右子树的最小元素或左子树的最大元素替代被删除结点
4. 代码实现
#include<iostream>
#include<malloc.h>
using namespace std;
typedef int ElementType;
typedef struct TreeNode *BinTree;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
// 查找递归实现
BinTree Find(ElementType X,BinTree BST){
if(!BST) // 如果根结点为空,返回 NULL
return NULL;
if(X < BST->Data) // 比根结点小,去左子树查找
return Find(X,BST->Left);
else if(BST->Data < X) // 比根结点大,去右子树查找
return Find(X,BST->Right);
else if(BST->Data == X) // 找到了
return BST;