最最最需要注意的就是二级指针的运用
#include <bits/stdc++.h>
using namespace std;
enum Status {False,Success};
//定义树的数据类型
typedef int Type;
typedef struct Tree{
Type data;
struct Tree *lchild, *rchild;
}Tree;
//先序遍历
void Ergodic(Tree *T)
{
if (T)
{
Ergodic(T->lchild);
cout << T->data << " ";
Ergodic(T->rchild);
}
}
Status SearchTree(Tree *T, Type key, Tree *f, Tree **p)
{
//没找到
if (!T)
{
*p = f;
return False;
}
else if (T->data == key)
{
*p = T;
return Success;
}
else if (T->data > key)
{
SearchTree(T->lchild, key, T, p);
}
else
SearchTree(T->rchild, key, T, p);
};
Status InsertTree(Tree **T,Type key)
{
Tree *p = NULL;
Tree *s;
if (!SearchTree(*T, key, NULL, &p))
{
s = (Tree *)malloc(sizeof(Tree));
s->data = key;
s->lchild = NULL;
s->rchild = NULL;
cout << key << endl;
if (!p)
*T = s;
else if (p->data > key)
p->lchild = s;
else
p->rchild = s;
}
else
return False;
return Success;
}
Status Delete(Tree **T, Tree *f)
{
Tree *p = NULL;
Tree *s = NULL;
//左子树为空,接右子树
if (!(*T)->lchild)
{
p = *T;
f->lchild = (*T)->rchild;
free(p);
}
//右子树为空,接左子树
else if (!(*T)->rchild)
{
p = *T;
f->lchild = (*T)->lchild;
free(p);
}
//左右子树均不为空
else
{
p = *T;
s = (*T)->lchild;
while (s->rchild)
{
p = s;
s = s->rchild;
}
(*T)->data = s->data;
if (p == *T)
{
p->lchild = s->lchild;
free(s);
}
else
{
p->rchild = s->lchild;
free(s);
}
}
return Success;
}
Status DeleteTree(Tree **T,int key,Tree *f)
{
if (!(*T))
return False;
else if ((*T)->data == key)
{
Delete(T,f);
return Success;
}
else if ((*T)->data > key)
DeleteTree(&((*T)->lchild),key,*T);
else
DeleteTree(&((*T)->rchild), key, *T);
}
int main()
{
int key;
int val;
cin >> key;
int a[10] = { 62,88,58,47,35,73,51,99,37,93 };
Tree *T = NULL;
for (int i = 0; i < 10; i++)
{
val = InsertTree(&T, a[i]);
}
Ergodic(T);
DeleteTree(&T,key,NULL);
Ergodic(T);
return 0;
}