二叉排序树的实现
Posted wzt392217419
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉排序树的实现相关的知识,希望对你有一定的参考价值。
1. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现
查找
//伪代码
SearchBST(T, key)
{
if (T为空 || T->key == key)
return T;
if (key > T->key)
return SearchBST(T->rchild, key);
else
return SearchBST(T->lchild, key);
}
//代码实现
BSTree SearchBST(BSTree T,int key)
{
if (T == NULL || T->key == key)
return T;
if (key > T->key)
return SearchBST(T->rchild, key);
else
return SearchBST(T->lchild, key);
}
插入
//伪代码
InsertBST(T, key)
{
if(T为空)
{
T->key = key;
T->lchild = T->rchild = NULL;
}
else if (key == T->key)
return;
else if(key > T->key)
Insert(T->rchild, key);
else
Insert(T->lchild, key);
}
//代码实现
void InsertBST(BSTree &T,int key)
{
if(T == NULL)
{
T = new BSTNode;
T->key = key;
T->lchild = T->rchild = NULL;
}
else if (key == T->key)
return;
else if(key > T->key)
InsertBST(T->rchild, key);
else
InsertBST(T->lchild, key);
}
2. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
创建
//伪代码
CreateBST(n) //n为输入的数据量
{
for (i = 0; i<n; i++)
{
cin >> key;
InsertBST(T, key);
}
return T;
}
//代码实现
BSTree CreateBST(int n)
{
BSTree T = NULL;
int key;
for (int i = 0; i<n; i++)
{
cin >> key;
InsertBST(T, key);
}
return T;
}
输出效果:
3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项。
//伪代码
DeleteBST(T, key)
{
if (T为空)
{
return;
}else
{
if (key < T->key)
{
DeleteBST(T->lchild, key);
}
else if (key > T->key)
{
DeleteBST(T->rchild, key);
}else
{
DeleteT(T); //调用删除结点函数
}
}
}
DeleteT(T)
{
if (T->rchild 为空)
{
p = T;
T = T->lchild;
删除结点p;
}else if (T->lchild 为空)
{
p = T;
T = T->rchild;
删除结点p;
}else
{
DeleteTree(T,T->lchild); //结点p左右子树均存在时,调用另一删除函数
}
}
DeleteTree(T,r)
{
if (r->rchild 不为空)
{
DeleteTree(T,r->rchild); //找到最右结点
}else
{
T->key = r->key;
p = r;
r = r->lchild;
删除结点p;
}
}
4. 选做:使用代码实现DeleteBST(T, key)
//代码实现
void DeleteBST(BSTree &T,int key)
{
if (T == NULL)
{
return;
}else
{
if (key < T->key)
{
DeleteBST(T->lchild, key);
}
else if (key > T->key)
{
DeleteBST(T->rchild, key);
}else
{
DeleteT(T); //调用删除结点函数
}
}
}
void DeleteT(BSTree &T)
{
BSTree p;
if (T->rchild == NULL)
{
p = T;
T = T->lchild;
delete p;
}else if (T->lchild == NULL)
{
p = T;
T = T->rchild;
delete p;
}else
{
DeleteTree(T,T->lchild); //结点p左右子树均存在时,调用另一删除函数
}
}
void DeleteTree(BSTree &T,BSTree &r)
{
BSTree p;
if (r->rchild)
{
DeleteTree(T,r->rchild);
}else
{
T->key = r->key;
p = r;
r = r->lchild;
delete p;
}
}
效果(删除30):
以上是关于二叉排序树的实现的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段