二叉排序树原理与实现
基本特性
- 定义:二叉排序树(Binary Search Tree)的根节点左子树所有值均小于根节点,右子树所有值均大于根节点。任意节点的子树均需满足此要求。
- 查找极值:左子树的最大值位于左子树的最右侧;右子树的最小值位于右子树的最左侧。
- 构建规则:依次与当前根节点对比,小于则向左,大于则向右,直到插入位置左右子树为空时停止并插入。
- 查找复杂度:最大查找次数等于树的深度,类似于折半查找,每次排除一半的搜索空间。
删除操作
基于二叉树查找定位待删除节点 root:
- 无左/右子树:直接将非空子树覆盖
root节点即可。 - 左右子树均不为空:进入
root的左子树,找到最大值节点tempNode,将tempNode的值赋给root,再在root的左子树中删除tempNode节点。 - 核心思想:用左子树中的最大节点作为'替身'替换待删除节点,而非直接物理删除原节点。
代码实践
/* 二叉排序树(又叫二叉查找树) */
#include <iostream>
using namespace std;
typedef int KeyType;
// 树节点结构
typedef struct BSTNode {
KeyType key; // 数据域
struct BSTNode *lchild, *rchild; // 左孩子,右孩子
} BSTNode, *BiTree;
// 插入结点
int BST_Insert(BiTree &T, KeyType k) {
if (T == NULL) {
T = (BSTNode *)malloc(sizeof(BSTNode));
T->key = k;
T->lchild = T->rchild = NULL;
return 1;
} else if (k == T->key) {
;
} (k < T->key) {
(T->lchild, k);
} {
(T->rchild, k);
}
}
{
T = ;
i = ;
(i < n) {
(T, str[i]);
i++;
}
}
{
p = ;
(T != && key != T->key) {
p = T;
(key < T->key) {
T = T->lchild;
} {
T = T->rchild;
}
}
T;
}
{
(root == ) {
;
}
(root->key > x) {
(root->lchild, x);
} (root->key < x) {
(root->rchild, x);
} {
(root->lchild == ) {
BSTNode *tempNode = root;
root = root->rchild;
(tempNode);
} (root->rchild == ) {
BSTNode *tempNode = root;
root = root->lchild;
(tempNode);
} {
BSTNode *tempNode = root->lchild;
(tempNode->rchild != ) {
tempNode = tempNode->rchild;
}
root->key = tempNode->key;
(root->lchild, tempNode->key);
}
}
}
{
(T != ) {
(T->lchild);
cout << T->key << ;
(T->rchild);
}
}
{
BiTree T;
BSTNode *parent;
BSTNode *search;
KeyType str[] = {, , , , , , };
(T, str, );
(T);
();
search = (T, , parent);
(search) {
(, search->key);
} {
();
}
(T, );
(T);
;
}

