C语言数据结构之二叉树
来源:互联网 发布:java考试题库 编辑:程序博客网 时间:2024/05/18 09:21
#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);
}
- C语言数据结构之二叉树
- C语言数据结构之二叉树篇
- C语言-数据结构-二叉树
- c语言数据结构之二叉(查找)树
- 数据结构C语言实现之二叉树链式结构
- 数据结构(C语言描述)读书笔记之二叉树
- 数据结构之---C语言实现二叉树的顺序存储
- 数据结构之---C语言实现线索二叉树
- C语言数据结构之二叉树的操作
- 数据结构之---C语言实现二叉树的二叉链表存储表示
- 二叉树排序 --C语言数据结构
- (C语言)二叉树实现(数据结构十三)
- [数据结构]C语言二叉树的实现
- 数据结构-------------线索二叉树(c语言)
- 数据结构C语言二叉树的遍历
- c语言实现二叉树数据结构
- C语言二叉树的数据结构实现
- (C语言-数据结构)还原二叉树-改进
- 用MDK生成bin文件的步骤及方法
- Errors running builder 'Android Pre Compiler' on project
- Hibernate继承映射
- Creo二次开发--函数(3)--菜单类函数
- 玩具语言LLL之Hash
- C语言数据结构之二叉树
- spring配置hibernate的sessionFactory的几种方法GOOD
- 新开始,新征程!2013-1-27
- C代码优化方案
- 在Linux里设置环境变量的方法(export PATH)--路径
- [LeetCode] Merge Two Sorted Lists
- (转)Win32应用程序的加载与启动分析
- ADO.net入门(二)快快乐乐走婆家(连接到数据库)
- 代理模式(Proxy)案例