#include <stdio.h>
#include <stdlib.h>
//二叉排序树删除实战--考研没考过大题,因此王道数据结构书中没有代码
typedef int KeyType;
typedef struct BSTNode { //binary sserch tree
KeyType key;
struct BSTNode *lchild, *rchild;
} BSTNode, *BiTree;
//非递归创建二叉查找树
//不允许相同元素插入树中,考研也不考放相等元素
int BST_Insert(BiTree &T, KeyType k) {
BiTree TreeNew = (BiTree) calloc(1, sizeof(BSTNode));
TreeNew->key = k;
if (!T) {//如果是root
T = TreeNew;
return 1;
}
BiTree p = T,parent; //用来遍历树来查找
while (p) {
parent = p;
if (k > p->key) {
p=p->rchild;
}else if(k< p->key){
p=p->lchild;
} else{
return 0; //相等元素不可以放入查找树,考研不考这个
}
}
//接下来判断放到parent的左边还是右边
if(k>parent->key){
parent->rchild=TreeNew;
}else{
parent->lchild=TreeNew;
}
return 1;
}
void Creat_BST(BiTree &T, KeyType *str, int len) {
for (int i = 0; i < len; ++i) {
BST_Insert(T, str[i]);
}
}
//二叉查找树只会考中序遍历,因为会输出有序序列
void InOrder(BiTree T) {
if (T) {
InOrder(T->lchild);
printf("%d ", T->key);
InOrder(T->rchild);
}
}
BiTree BST_Search(BiTree T,KeyType k ,BiTree &parent){
parent= NULL;
while (T&&k!=T->key){
parent=T;
if(k > T->key){
T=T->rchild;
} else if(k<T->key){
T=T->lchild;
}
}
return T;
}
//与BST_Search是一样的功能,递归写法,代码简单,理解困难
int BST_Insert1(BiTree &T,KeyType k){
if(!T){
T=(BiTree) calloc(1,sizeof (BSTNode));
T->key=k;
return 1; //1 表示插入成功
} else if(k==T->key){
return 0;
} else if(k<T->key){
return BST_Insert1(T->lchild,k);
} else{
return BST_Insert1(T->rchild,k);
}
}
void DeleteNode(BiTree &root,KeyType x){
if(!root){
return;
}
if(root->key>x){
DeleteNode(root->lchild,x);
} else if(root->key<x){
DeleteNode(root->rchild,x);
} else{ //找到了要删除的结点,即 root->key == x
if(root->lchild==NULL){
BiTree temNode=root;
root=root->rchild;
free(temNode);
} else if(root->rchild==NULL){
BiTree temNode=root;
root=root->lchild;
free(temNode);
} else{ //要删除结点的左右结点都不为空
//策略:用左子树的最右结点 or 右子树的最左结点代替要删除的结点
//此处为 前者
BiTree tempNode = root->lchild; //指向
while (tempNode->rchild){
tempNode=tempNode->rchild;
}
root->key=tempNode->key;
DeleteNode(root->lchild,tempNode->key); //删除左子树的最右结点
}
}
};
//二叉排序树/查找树的新建、中序遍历、查找
int main() {
BiTree T = NULL; //树根
KeyType str[7] = {54, 20, 66, 40, 28, 79, 58};
Creat_BST(T, str, 7);
InOrder(T);
printf("\n");
BiTree serch,parent; //返回查找到的结点,及父节点
serch = BST_Search(T,41,parent);
if(serch){
printf("find key: %d\n",serch->key);
} else{
printf("not find");
}
printf("\n");
DeleteNode(T,1);
InOrder(T);
return 0;
}
06-24
906

12-07
1366

01-09
594

09-17