回复 20楼 九转星河
嗯……找时间吧。还是那个字……忙。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
[此贴子已经被作者于2017-5-11 00:28编辑过]

程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<assert.h>
#define LEN sizeof(TREE)
typedef int ElemType;
typedef struct TREE
{
ElemType Value;
struct TREE* left;
struct TREE* right;
struct TREE* prior;
}TREE,*PTREE;
void Init(PTREE* t);
void Creat_Node(void** t,size_t size);
int Insert_Value(PTREE* t,ElemType Value);
void Insert_Node(PTREE t,ElemType Value);
void Pre_Order_Traversal(PTREE t);
void In_Order_Traversal(PTREE t);
void Post_Order_Traversal(PTREE t);
PTREE Find_Min(PTREE t);
PTREE Find_Max(PTREE t);
PTREE Find_Node(PTREE t,ElemType Value);
int Del_Node(PTREE* t,ElemType Value);
int Del_Root(PTREE* t);
int Del_Left(PTREE* t);
int Del_Right(PTREE* t);
int Del_Double(PTREE* t);
int Visit(PTREE t);
void Free_Tree(PTREE* t);
void Free_Node(void** t);
int main()
{
PTREE t=NULL;
PTREE tm=NULL;
int a=0;
Init(&t);
Pre_Order_Traversal(t);
puts("");
In_Order_Traversal(t);
puts("");
Post_Order_Traversal(t);
puts("");
printf("请输入要删除的节点:");
while ( scanf("%d",&a)!=EOF)
{
Del_Node(&t,a);
Pre_Order_Traversal(t);
puts("");
In_Order_Traversal(t);
puts("");
Post_Order_Traversal(t);
puts("");
printf("请输入要删除的节点:");
}
Free_Tree(&t);
return 0;
}
void Init(PTREE* t)
{
ElemType Value=0;
int i=10;
srand((unsigned)time(NULL));
while (i--)
{
Value=rand()%100;
Insert_Value(t,Value);
}
}
void Creat_Node(void** t,size_t size)
{
*t=malloc(size);
assert(*t!=NULL);
memset(*t,0,size);
}
int Insert_Value(PTREE* t,ElemType Value)
{
PTREE* pt=t;
PTREE s=NULL;
while (*pt!=NULL)
if (Value<(*pt)->Value)
{
s=*pt;
pt=&((*pt)->left);
}
else if (Value>(*pt)->Value)
{
s=*pt;
pt=&((*pt)->right);
}
else
return 0;
Creat_Node(pt,LEN);
(*pt)->prior=s;
Insert_Node(*pt,Value);
return 1;
}
void Insert_Node(PTREE t,ElemType Value)
{
if (t==NULL)
return ;
t->Value=Value;
}
int Visit(PTREE t)
{
if (t==NULL)
return 0;
printf("%-4d",t->Value);
return 1;
}
void Pre_Order_Traversal(PTREE t)
{
if (t==NULL)
return ;
Visit(t);
Pre_Order_Traversal(t->left);
Pre_Order_Traversal(t->right);
}
void In_Order_Traversal(PTREE t)
{
if (t==NULL)
return ;
In_Order_Traversal(t->left);
Visit(t);
In_Order_Traversal(t->right);
}
void Post_Order_Traversal(PTREE t)
{
if (t==NULL)
return ;
Post_Order_Traversal(t->left);
Post_Order_Traversal(t->right);
Visit(t);
}
PTREE Find_Min(PTREE t)
{
if (t==NULL)
return t;
while (t->left!=NULL)
t=t->left;
return t;
}
PTREE Find_Max(PTREE t)
{
if (t==NULL)
return t;
while (t->right!=NULL)
t=t->right;
return t;
}
PTREE Find_Node(PTREE t,ElemType Value)
{
if (t==NULL)
return t;
while (t!=NULL)
if (Value<t->Value)
t=t->left;
else if (Value>t->Value)
t=t->right;
else
return t;
return t;
}
int Del_Node(PTREE* t,ElemType Value)
{
PTREE pt=*t;
if ((pt=Find_Node(*t,Value))==NULL)
return 0;
if (pt==*t)
Del_Root(t);
else if (pt->prior->left==pt)
Del_Left(&pt);
else
Del_Right(&pt);
return 1;
}
int Del_Root(PTREE* t)
{
PTREE ps=NULL;
if ((*t)->left==NULL&&(*t)->right==NULL)
{
Free_Node(t);
return 1;
}
if ((*t)->left!=NULL&&(*t)->right==NULL)
{
ps=(*t)->left;
ps->prior=NULL;
Free_Node(t);
*t=ps;
return 1;
}
if ((*t)->right!=NULL&&(*t)->left==NULL)
{
ps=(*t)->right;
ps->prior=NULL;
Free_Node(t);
*t=ps;
return 1;
}
ps=Find_Min((*t)->right);
ps->left=(*t)->left;
(*t)->left->prior=ps;
if (ps->prior==*t)
{
ps->prior=NULL;
Free_Node(t);
*t=ps;
return 1;
}
ps->prior->left=ps->right;
if (ps->right!=NULL)
ps->right->prior=ps->prior;
ps->right=(*t)->right;
(*t)->right->prior=ps;
ps->prior=NULL;
Free_Node(t);
*t=ps;
return 1;
}
int Del_Left(PTREE* t)
{
PTREE pt=(*t)->prior;
if ((*t)->left==NULL&&(*t)->right==NULL)
{
pt->left=NULL;
Free_Node(t);
return 1;
}
if ((*t)->left==NULL)
{
pt->left=(*t)->right;
(*t)->right->prior=pt;
Free_Node(t);
return 1;
}
if ((*t)->right==NULL)
{
pt->left=(*t)->left;
(*t)->left->prior=pt;
Free_Node(t);
return 1;
}
Del_Double(t);
return 1;
}
int Del_Right(PTREE* t)
{
PTREE pt=(*t)->prior;
if ((*t)->left==NULL&&(*t)->right==NULL)
{
pt->right=NULL;
Free_Node(t);
return 1;
}
if ((*t)->left==NULL)
{
pt->right=(*t)->right;
(*t)->right->prior=pt;
Free_Node(t);
return 1;
}
if ((*t)->right==NULL)
{
pt->right=(*t)->left;
(*t)->left->prior=pt;
Free_Node(t);
return 1;
}
Del_Double(t);
return 1;
}
int Del_Double(PTREE* t)
{
PTREE ps=Find_Min((*t)->right);
if ((*t)->prior->left==*t)
(*t)->prior->left=ps;
else
(*t)->prior->right=ps;
ps->left=(*t)->left;
(*t)->left->prior=ps;
if (ps->prior==*t)
{
ps->prior=(*t)->prior;
Free_Node(t);
return 1;
}
ps->prior->left=ps->right;
if (ps->right!=NULL)
ps->right->prior=ps->prior;
ps->right=(*t)->right;
(*t)->right->prior=ps;
ps->prior=(*t)->prior;
Free_Node(t);
return 1;
}
void Free_Tree(PTREE* t)
{
if (*t==NULL)
return ;
Free_Tree(&(*t)->left);
Free_Tree(&(*t)->right);
Free_Node(t);
*t=NULL;
}
void Free_Node(void** t)
{
if (*t==NULL)
return ;
free(*t);
*t=NULL;
}[此贴子已经被作者于2017-5-12 04:41编辑过]
