#include <stdio.h>
#include <stdlib.h>
//声明一个树的节点
typedef struct tree
{
char node;
struct tree *left;
struct tree *right;
} TreeNode;
TreeNode * TreeRoot=NULL;//建立根节点
int IsEmptyTree(TreeNode *root)
{
if(root==NULL)
{
return 1;
}
else
{
return 0;
}
}
TreeNode *AddOneNode(TreeNode *Chileroot,TreeNode *NextPoint,char node)
{
if(NextPoint!=NULL)
{
if(node<NextPoint->node)
{
AddOneNode(NextPoint,NextPoint->left,node);
}
else
{
AddOneNode(NextPoint,NextPoint->right,node);
}
return Chileroot;
}
else
{
NextPoint=(TreeNode *)malloc(sizeof(TreeNode));
NextPoint->left=NULL;
NextPoint->right=NULL;
NextPoint->node=node;
if(Chileroot!=NULL)
{
if(node<Chileroot->node)
{
Chileroot->left=NextPoint;
}
else
{
Chileroot->right=NextPoint;
}
}
return NextPoint;
}
}
void CreateTree()
{
char tmp=0;
printf("请输入树节点数据!\n");
scanf("%c",&tmp);
while(tmp!='.')
{
TreeRoot=AddOneNode(TreeRoot,TreeRoot,tmp);
scanf("%c",&tmp);
}
}
void MidorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("i9898搜索失败!\n");
return;
}
MidorderDisplay(root->left);
printf("%c\n",root->node);
MidorderDisplay(root->right);
}
void PreorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("89搜索失败!\n");
return;
}
printf("%c\n",root->node);
PreorderDisplay(root->left);
PreorderDisplay(root->right);
}
void PostorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("=搜索失败!\n");
return;
}
PostorderDisplay(root->left);
PostorderDisplay(root->right);
printf("%c\n",root->node);
}
TreeNode *Search(TreeNode *TreeRoot,char keynode)
{
if(IsEmptyTree(TreeRoot))
{
printf("这是一个空树,搜索失败!\n");
return;
}
while(TreeRoot->node!=keynode)
{
if(keynode<TreeRoot->node)
TreeRoot=TreeRoot->left;
else
TreeRoot=TreeRoot->right;
if(IsEmptyTree(TreeRoot))
{
break;
}
}
return TreeRoot;
}
TreeNode *DeleNode(TreeNode *root,char keynode)
{
TreeNode *Point,*Point1;
if(IsEmptyTree(root))
{
printf("这是个空树!\n");
return NULL;
}
if(root->node==keynode)//如果找到了
{
if(root->left==root->right)//这说明是空树
{
free(root);
return NULL;
}
else if(root->left==NULL)
{
Point=root->right;
free(root);
return Point;
}
else if(root->right==NULL)
{
Point=root->left;
free(root);
return Point;
}
else
{
Point1=Point=root->right;
//寻找root右边子树的最左节点
while(Point->left!=NULL) Point=Point->left;
Point=root->left;//将root左边的子树接到右子树的最左极点
free(root);
return Point1;
}
}
else if(keynode>root->node)//如果当前节点小于关键字
{
root->right=DeleNode(root->right,keynode);
return root;
}
else if(keynode<root->node)//如果当前节点大于关键字
{
root->left=DeleNode(root->left,keynode);
return root;
}
}
int main()
{
TreeNode *tmp;
char chartmp;
CreateTree();
printf("前序遍历!\n");
PreorderDisplay(TreeRoot);
printf("中序遍历!\n");
MidorderDisplay(TreeRoot);
printf("后续遍历!\n");
PostorderDisplay(TreeRoot);
chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
printf("输入你要搜索的数据:");
scanf("%c",&chartmp);
tmp=Search(TreeRoot,chartmp);
if(tmp)
{
printf("%c 是你要找的吗\n",tmp->node);
}
else
{
printf("找不到 %c\n",chartmp);
}
chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
printf("输入你要删除的节点的数值:\n");
scanf("%c",&chartmp);
TreeRoot=DeleNode(TreeRoot,chartmp);
printf("前序遍历!\n");
PreorderDisplay(TreeRoot);
printf("中序遍历!\n");
MidorderDisplay(TreeRoot);
printf("后续遍历!\n");
PostorderDisplay(TreeRoot);
}
#include <stdlib.h>
//声明一个树的节点
typedef struct tree
{
char node;
struct tree *left;
struct tree *right;
} TreeNode;
TreeNode * TreeRoot=NULL;//建立根节点
int IsEmptyTree(TreeNode *root)
{
if(root==NULL)
{
return 1;
}
else
{
return 0;
}
}
TreeNode *AddOneNode(TreeNode *Chileroot,TreeNode *NextPoint,char node)
{
if(NextPoint!=NULL)
{
if(node<NextPoint->node)
{
AddOneNode(NextPoint,NextPoint->left,node);
}
else
{
AddOneNode(NextPoint,NextPoint->right,node);
}
return Chileroot;
}
else
{
NextPoint=(TreeNode *)malloc(sizeof(TreeNode));
NextPoint->left=NULL;
NextPoint->right=NULL;
NextPoint->node=node;
if(Chileroot!=NULL)
{
if(node<Chileroot->node)
{
Chileroot->left=NextPoint;
}
else
{
Chileroot->right=NextPoint;
}
}
return NextPoint;
}
}
void CreateTree()
{
char tmp=0;
printf("请输入树节点数据!\n");
scanf("%c",&tmp);
while(tmp!='.')
{
TreeRoot=AddOneNode(TreeRoot,TreeRoot,tmp);
scanf("%c",&tmp);
}
}
void MidorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("i9898搜索失败!\n");
return;
}
MidorderDisplay(root->left);
printf("%c\n",root->node);
MidorderDisplay(root->right);
}
void PreorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("89搜索失败!\n");
return;
}
printf("%c\n",root->node);
PreorderDisplay(root->left);
PreorderDisplay(root->right);
}
void PostorderDisplay(TreeNode *root)
{
if(root==NULL)
{
//printf("=搜索失败!\n");
return;
}
PostorderDisplay(root->left);
PostorderDisplay(root->right);
printf("%c\n",root->node);
}
TreeNode *Search(TreeNode *TreeRoot,char keynode)
{
if(IsEmptyTree(TreeRoot))
{
printf("这是一个空树,搜索失败!\n");
return;
}
while(TreeRoot->node!=keynode)
{
if(keynode<TreeRoot->node)
TreeRoot=TreeRoot->left;
else
TreeRoot=TreeRoot->right;
if(IsEmptyTree(TreeRoot))
{
break;
}
}
return TreeRoot;
}
TreeNode *DeleNode(TreeNode *root,char keynode)
{
TreeNode *Point,*Point1;
if(IsEmptyTree(root))
{
printf("这是个空树!\n");
return NULL;
}
if(root->node==keynode)//如果找到了
{
if(root->left==root->right)//这说明是空树
{
free(root);
return NULL;
}
else if(root->left==NULL)
{
Point=root->right;
free(root);
return Point;
}
else if(root->right==NULL)
{
Point=root->left;
free(root);
return Point;
}
else
{
Point1=Point=root->right;
//寻找root右边子树的最左节点
while(Point->left!=NULL) Point=Point->left;
Point=root->left;//将root左边的子树接到右子树的最左极点
free(root);
return Point1;
}
}
else if(keynode>root->node)//如果当前节点小于关键字
{
root->right=DeleNode(root->right,keynode);
return root;
}
else if(keynode<root->node)//如果当前节点大于关键字
{
root->left=DeleNode(root->left,keynode);
return root;
}
}
int main()
{
TreeNode *tmp;
char chartmp;
CreateTree();
printf("前序遍历!\n");
PreorderDisplay(TreeRoot);
printf("中序遍历!\n");
MidorderDisplay(TreeRoot);
printf("后续遍历!\n");
PostorderDisplay(TreeRoot);
chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
printf("输入你要搜索的数据:");
scanf("%c",&chartmp);
tmp=Search(TreeRoot,chartmp);
if(tmp)
{
printf("%c 是你要找的吗\n",tmp->node);
}
else
{
printf("找不到 %c\n",chartmp);
}
chartmp=getchar();//这个是用于接收输入流中最后的一个换行符丢掉,以免被后面的scanf接收
printf("输入你要删除的节点的数值:\n");
scanf("%c",&chartmp);
TreeRoot=DeleNode(TreeRoot,chartmp);
printf("前序遍历!\n");
PreorderDisplay(TreeRoot);
printf("中序遍历!\n");
MidorderDisplay(TreeRoot);
printf("后续遍历!\n");
PostorderDisplay(TreeRoot);
}