二叉排序树的实现(部分)
二叉排序树的实现
1.编写SearchBST(T, key)与InsertBST(T, key)的伪代码
-
SearchBST伪代码:
void SearchBST(T,key){ if(T为空||T==key) return T; if(T>key) SearchBST(T->lchild,key); else SearchBST(T->rchild,key); }
-
InsertBST伪代码:
void InsertBST(T,key){ if(T为空){ T=new Node; T=key; T->lchild=NULL; T->rchild=NULL; return true; }else if(T==key) return false; else if(T>key) InsertBST(T->lchild,key); else InsertBST(T->rchild,key); }
2.编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
-
CreateBST伪代码:
BSTree CreateBST(T){ T=new Node; T->lchild=NULL; T->rchild=NULL; //输入key if(T不空) T=key; while(key!=0){ //输入key if(T不空){ InsertBST(T,key); } } return T; }
-
创建BST树:
-
数据类型定义:
typedef struct BSTNode { int data; struct BSTNode* lchild, * rchild; }*BSTree;
-
SearchBST函数:
BSTree SearchBST(BSTree T, int key) { if (T == NULL || T->data == key) return T; if (T->data > key) return SearchBST(T->lchild, key); else return SearchBST(T->rchild, key); }
-
InsertBST函数:
bool InsertBST(BSTree T, int key) { if (T == NULL){ T = new BSTNode; T->data = key; T->lchild = NULL; T->rchild = NULL; return true; } else if (T->data == key) return false; else if (T->data > key) return InsertBST(T->lchild, key); else return InsertBST(T->rchild, key); }
-
CreateBST函数:
BSTree CreateBST(BSTree T) { T = new BSTNode; T->lchild = NULL; T->rchild = NULL; int key; cin >> key; if (T != NULL) T->data = key; while (key != 0) { cin >> key; if (T != NULL) { InsertBST(T, key); } } return T; }
-
中序遍历:
void InOrder(BSTree T) { if (T != NULL) { InOrder(T->lchild); cout << T->data<<" "; InOrder(T->rchild); } }
-
main函数:
void main() { BSTree T; T = new BSTNode; int key; CreateBST(T); cout << "中序遍历结果为:" << endl; InOrder(T); cin >> key; SearchBST(T, key); InsertBST(T, key); InOrder(T); }
-
代码运行截图:
-
3.编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。
注意事项及要点:
删除关键字key首先要判断key所在结点的位置:①叶子结点②仅有左或右子树结点③左右子树都有的结点
①叶子结点:找到key后直接删除即可;
②仅有左或右子树结点:将T的双亲节点的rchild/lchild指向T的rchild/lchild,即将左右子树结点上移即可;
③左右子树都有的结点:方法一:以其前驱替代T结点,然后再删除该前驱结点。前驱是左子树中最大的结点。方法二:用其后继结点替代T结点,然后删除该后继结点。后继是右子树中最小结点。
DeleteBST伪代码:
void DeleteBST(T,key){
if(T为空) return 0;
else{
if(T>key)
DeleteBST(T->lchild,key);
else if(T<key)
DeleteBST(T->rchild,key);
else{
DeleteBST(T);
return 1;
}
}
}