1.SearchBST(T, key)与InsertBST(T, key)
SearchBST(T, key)
伪代码:
void SearchBST(BSTNode*& T, int key)
{
if (T为空 || T与key相等)
返回T
if (key<=T)
SearchBST(T->lchild, key)
if (key>T)
SearchBST(T->rchild, key)
}
代码:
void SearchBST(BSTNode* &T, int key)
{
if (T == NULL || key == T->data)
return;
if (key <= T->data)
SearchBST(T->lchild, key);
else if (key > T->data)
SearchBST(T->rchild, key);
}
InsertBST(T, key)
伪代码:
void InsertBST(BSTNode*& T, int key)
{
if(T为空){
初始化T
T->data = key
返回T
}
else{
if(key<=T)
InsertBST(T->lchild,key)
if(key>T)
InsertBST(T->rchild,key)
}
代码:
void InsertBST(BSTNode*& T, int key)
{
if (T == NULL) {
T = new BSTNode;
T->lchild = T->rchild = NULL;
T->data = key;
return;
}
else {
if (key <= T->data)
InsertBST(T->lchild, key);
else
InsertBST(T->rchild, key);
}
}
2.编写CreateBST(T)并使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,中序输出
伪代码:
BSTNode* CreateBST(BSTNode*& T)
{
int n,a[MAX]
输入个数n
for (int i = 0; i < n; i++)
{
数据输入数组
调用InsertBST函数
}
中序遍历Inorder(T)
返回T
}
代码:
BSTNode* CreateBST(BSTNode*& T)
{
int n,a[MAX];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
InsertBST(T, a[i]);
}
Inorder(T);
return T;
}
实现效果:
3.在BST中删除关键字key所需注意的事项
- 当所删除的节点为叶子节点时,直接删除即可
- 当仅有左或右子树的节点时,只需要上移其子树
- 当节点为左右子树都有的节点,删除节点的直接前驱或者直接后继来替换当前节点,调整直接前驱或者直接后继的位置