用c++实现任意给定一组数据,设计一个算法,建立一棵二叉排序树,对它进行查找、插入、删除等操作。二叉排序树存储结构如下:typedef struct BiTNode { // 结点结构 struct BiTNode *lchild, *rchild; // 左右孩子指针 } BiTNode, *BiTree;
时间: 2024-02-14 10:14:10 浏览: 81
好的,我会尽力回答你的问题。对于任意给定的一组数据,我们可以使用以下算法来建立一棵二叉排序树:
1. 创建一个空的二叉排序树。
2. 依次将给定的数据插入到二叉排序树中。
(1)如果树为空,则将第一个节点作为根节点。
(2)否则,从根节点开始遍历,如果插入的值比当前节点的值小,则继续遍历左子树,否则继续遍历右子树,直到找到一个空的位置插入新节点。
3. 插入完成后,二叉排序树就建立好了。
以下是实现查找、插入、删除等操作的代码:
```c++
#include <iostream>
using namespace std;
// 二叉排序树结点结构
typedef struct BiTNode {
int data; // 结点数据
struct BiTNode *lchild; // 左孩子指针
struct BiTNode *rchild; // 右孩子指针
} BiTNode, *BiTree;
// 查找数据
BiTNode* search(BiTree T, int x) {
if (!T) { // 为空,返回 NULL
return NULL;
} else if (x == T->data) { // 找到了,返回结点指针
return T;
} else if (x < T->data) { // 在左子树中查找
return search(T->lchild, x);
} else { // 在右子树中查找
return search(T->rchild, x);
}
}
// 插入数据
bool insert(BiTree &T, int x) {
if (!T) { // 空节点,插入新结点
T = new BiTNode;
T->data = x;
T->lchild = T->rchild = NULL;
return true;
} else if (x == T->data) { // 已存在,插入失败
return false;
} else if (x < T->data) { // 在左子树中插入
return insert(T->lchild, x);
} else { // 在右子树中插入
return insert(T->rchild, x);
}
}
// 删除数据
bool del(BiTree &T, int x) {
if (!T) { // 空节点,删除失败
return false;
} else if (x == T->data) { // 找到了要删除的结点
if (T->lchild && T->rchild) { // 左右子树都不为空,寻找中序遍历的前驱或后继结点
BiTree p = T->lchild;
while (p->rchild) {
p = p->rchild;
}
T->data = p->data; // 将前驱或后继结点的值赋给当前结点
del(T->lchild, p->data); // 递归删除前驱或后继结点
} else { // 左右子树至少一个为空,直接删除
BiTree q = T;
if (T->lchild) {
T = T->lchild;
} else {
T = T->rchild;
}
delete q;
}
return true;
} else if (x < T->data) { // 在左子树中删除
return del(T->lchild, x);
} else { // 在右子树中删除
return del(T->rchild, x);
}
}
// 中序遍历
void inorder(BiTree T) {
if (T) {
inorder(T->lchild);
cout << T->data << " ";
inorder(T->rchild);
}
}
int main() {
BiTree T = NULL; // 初始化空树
// 插入数据
insert(T, 5);
insert(T, 3);
insert(T, 7);
insert(T, 2);
insert(T, 4);
insert(T, 6);
insert(T, 8);
// 打印中序遍历结果
inorder(T);
cout << endl;
// 查找数据
BiTNode *p = search(T, 6);
if (p) {
cout << "Found: " << p->data << endl;
} else {
cout << "Not Found!" << endl;
}
// 删除数据
del(T, 5);
// 打印中序遍历结果
inorder(T);
cout << endl;
return 0;
}
```
以上代码实现了二叉排序树的查找、插入、删除和中序遍历操作。在实际使用中,还可以根据具体需求进行扩展和优化。
阅读全文