#include <iostream>
#include <stdio.h>
#include <stdlib.h>
typedef int KeyType;
typedef struct BSTNode{
KeyType key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BiTree;
//递归
int BST_Insert(BiTree &T,KeyType k)
{
if(NULL==T)
{
//为新结点申请空间,第一个作为树根,后面递归再进入的不是树根,是为叶子结点
T= (BiTree)calloc(1,sizeof(BSTNode) );
T->key=k;
return 1;
} else if(k==T->key)
return 0;//发现相同元素,不插入,考研不考
else if(k<T->key)
return BST_Insert(T->lchild,k);
else
return BST_Insert(T->rchild,k);
}
void Creat_BST(BiTree &T,KeyType *str,int n)
{
T=NULL;//T是树根
int i=0;
while (i<n)
{
BST_Insert(T,str[i]);//把某一个结点放入二叉树
i++;
}
}
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild);
printf("%3d",T->key);
InOrder(T->rchild);
}
}
BSTNode *BST_Search(BiTree T,KeyType key,BiTree &p)
{
p=NULL;
while (T!=NULL&&key!=T->key)
{
p=T;
if (key<T->key)
T=T->lchild;
else
T=T->rchild;
}
return T;
}
void DeleteNode(BiTree &root,KeyType x)
{
if(root==NULL)
{
return;;
}
if(root->key>x)
{
DeleteNode(root->lchild,x);//大于要删除的元素,去左子树找
} else if (root->key<x)
{
DeleteNode(root->rchild,x);//小于要删除的元素,去右子树找
} else//查到了要删除的结点
{
if(root->lchild==NULL)
{//左子树为空右子树直接顶上去
BiTree tempNode=root;
root=root->rchild;
free(tempNode);
} else if(root->rchild==NULL)
{//右子树为空左子树直接顶上去
BiTree tempNode=root;
root=root->lchild;
free(tempNode);//临时存放的一定要释放
} else
{//左右子树都不为空
BiTree tempNode=root->lchild;
while (tempNode->rchild!=NULL)
{
tempNode=tempNode->rchild;
}
root->key=tempNode->key;
DeleteNode(root->lchild,tempNode->key);//在左子树中找到tempNode删除 比较难 多想想就能理解
}
}
}
int main() {
BiTree T=NULL;//树根
BiTree parent;//存储父亲结点的地址值
BiTree search;
KeyType str[7]={54,20,66,40,28,79,58};
Creat_BST(T,str,7);
InOrder(T);
printf("\n");
search= BST_Search(T,41,parent);
if(search)
{
printf("find key %d\n",search->key);
} else
{
printf("not found\n");
}
DeleteNode(T,40);//删除某个结点
InOrder(T);
printf("\n");
return 0;
}
03-28
2471