关于二叉树,最近被这些搞得头昏脑涨。于是专门写了程序。直接放代码了。
#include<stdlib.h>
#include<stdio.h>
//二叉树结点的描述
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild; //左右孩子
}BiTNode,*BiTree;
BiTNode* createBiTNode(int data)
{
BiTNode *tmp;
tmp=(BiTNode*)malloc(sizeof(BiTNode));
tmp->data=data;
tmp->lchild=tmp->rchild=0;
return tmp;
}
//按先序遍历创建二叉树void
void createBiTree(BiTNode **root) //二级指针作为函数参数
{
int data; //要插入的数据
scanf("%d", &data);
if(data==0)
*root = NULL;
else
{
*root = createBiTNode(data);
printf("请输入%d的左孩子(必须比父节点的数据小 按0跳过输入):",data);
createBiTree(&((*root)->lchild));
printf("请输入%d的右孩子(必须比父节点的数据大 按0跳过输入):",data);
createBiTree(&((*root)->rchild));
}
}
//前序遍历的算法程序
void preOrder(BiTNode *root)
{
if(root==NULL)
return ;
printf("%d ", root->data); //输出数据
preOrder(root->lchild); //递归调用,前序遍历左子树
preOrder(root->rchild); //递归调用,前序遍历右子树
}
//中序遍历的算法程序
void inOrder(BiTNode *root)
{
if(root==NULL)
return ;
inOrder(root->lchild); //递归调用,前序遍历左子树
printf("%d ", root->data); //输出数据
inOrder(root->rchild); //递归调用,前序遍历右子树
}
//后序遍历的算法程序
void postOrder(BiTNode *root)
{
if(root==NULL)
return ;
postOrder(root->lchild); //递归调用,前序遍历左子树
postOrder(root->rchild); //递归调用,前序遍历右子树
printf("%d ", root->data); //输出数据
}
BiTNode* search_BiTNode(BiTNode *root,int data)
{
while(root)
{
if(data<root->data)
{
root=root->lchild;
}
else if(data>root->data)
{
root=root->rchild;
}
else
{
return root;
}
}
return NULL;
}
void add_BiTNode(BiTNode *root,int data)
{
BiTNode *tmp,*p=root;
while(p)
{
if(p->data>data)
{
tmp=search_BiTNode(p,p->data);//记录父节点
p=p->lchild;
}
else if(p->data<data)
{
tmp=search_BiTNode(p,p->data);//记录父节点
p=p->rchild;
}
else
{
printf("已有该数据,不能重复添加!\n");
return;
}
}
if(tmp->data<data)
{
p=createBiTNode(data);
tmp->rchild=p;
printf("添加成功!\n");
}
else
{
p=createBiTNode(data);
tmp->lchild=p;
printf("添加成功!\n");
}
}
void change_BiTNode(BiTNode *root,int data)
{
BiTNode *T=search_BiTNode(root,data);
if(!T)
{
printf("未找到结点!错误!\n");
return;
}
printf("请输入新数据:");
scanf("%d",&T->data);
printf("数据修改成功!\n");
}
void delete_BiTNode(BiTNode *root,int data)
{
BiTNode *tmp=search_BiTNode(root,data);
BiTNode *p=root;//记录T的父结点
if(!tmp)
{
printf("未找到结点!错误!\n");
return;
}
while(p)
{
if(p->data>data)
{
tmp=search_BiTNode(p,p->data);//记录父节点
p=p->lchild;
}
else if(p->data<data)
{
tmp=search_BiTNode(p,p->data);//记录父节点
p=p->rchild;
}
else
break;
}
if(!p->lchild&&!p->rchild)//p为叶子结点
{
if(tmp->data>p->data)
{
tmp->lchild=NULL;//p的父结点指针置零
free(p);//释放内存
}
else
{
tmp->rchild=NULL;
free(p);
}
}
else if(p->lchild&&!p->rchild)//p有左孩子没右孩子
{
if(tmp->data>p->data)
{
tmp->lchild=p->lchild;
free(p);//释放内存
}
else
{
tmp->rchild=p->lchild;
free(p);
}
}
else if(!p->lchild&&p->rchild)//p有右孩子没有左孩子
{
if(tmp->data>p->data)
{
tmp->lchild=p->rchild;
free(p);//释放内存
}
else
{
tmp->rchild=p->rchild;
free(p);
}
}
else if(p->lchild&&p->rchild)//两个孩子都有
{
/**由于这部分情况很复杂,有机会再做总结**/
return;
}
}
int depth(BiTNode *T) //树的深度
{
if(T==NULL)
return 0;
return (depth(T->lchild)>depth(T->rchild)?depth(T->lchild):depth(T->rchild))+1;
}
int countNode(BiTNode *T)
{
if(T==NULL)
return 0;
return 1+countNode(T->lchild)+countNode(T->rchild);
}
int main()
{
BiTNode *root=NULL; //定义一个根结点
int op;
int data;
do
{
system("cls");
printf("\t\t本程序实现二叉树的基本操作。\n");
printf("可以进行建立二叉树,递归先序、中序、后序遍历,增加,删除,修改,搜索等操作。\n");
printf("\n");
printf("|--------------------------------------------------------------|\n");
printf("| 二叉树的基本操作如下: |\n");
printf("| 1.创建二叉树 |\n");
printf("| 2.递归先序遍历 |\n");
printf("| 3.递归中序遍历 |\n");
printf("| 4.递归后序遍历 |\n");
printf("| 5.查找二叉树元素 |\n");
printf("| 6.添加二叉树元素 |\n");
printf("| 7.修改二叉树元素 |\n");
printf("| 8.删除二叉树元素 |\n");
printf("| 9.二叉树的深度 |\n");
printf("| 10.二叉树的结点个数 |\n");
printf("| 11.清空二叉树元素 |\n");
printf("| 0.退出程序 |\n");
printf("|--------------------------------------------------------------|\n");
printf("\t\t请选择功能:");
scanf("%d",&op);
switch(op)
{
case 1:
system("cls");
printf("请建立二叉树并输入二叉树的根节点:");
createBiTree(&root);
system("pause");
break;
case 2:
system("cls");
if(root)
{
printf("递归先序遍历二叉树的结果为:");
preOrder(root);
printf("\n");
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 3:
system("cls");
if(root)
{
printf("递归中序遍历二叉树的结果为:");
inOrder(root);
printf("\n");
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 4:
system("cls");
if(root)
{
printf("递归后序遍历二叉树的结果为:");
postOrder(root);
printf("\n");
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 5:
{
system("cls");
BiTNode *T;
if(root)
{
printf("请输入要查找的数据:");
scanf("%d",&data);
T=search_BiTNode(root,data);
if(T)
{
printf("已找到数据!\n");
}
else
{
printf("未能找到数据!\n");
}
}
else
{
printf("\t二叉树为空!\n");
}
system("pause");
break;
}
case 6:
system("cls");
if(root)
{
printf("请输入你想要添加的结点数据:");
scanf("%d",&data);
add_BiTNode(root,data);
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 7:
system("cls");
if(root)
{
printf("请输入你想要修改的结点数据:");
scanf("%d",&data);
change_BiTNode(root,data);
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 8:
{
system("cls");
if(root)
{
printf("请输入要删除的元素值:");
scanf("%d",&data);
delete_BiTNode(root,data);
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
}
case 9:
system("cls");
if(root)
printf("这棵二叉树的深度为:%d\n",depth(root));
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 10:
system("cls");
if(root)
printf("这棵二叉树的结点个数为:%d\n",countNode(root));
else
printf("\t二叉树为空!\n");
system("pause");
break;
case 11:
system("cls");
if(root)
{
free(root);
root=NULL;
printf("清空二叉树成功!\n");
}
else
printf("\t二叉树为空!\n");
system("pause");
break;
default:
printf("程序运行结束,按任意键退出!\n");
}
}while(op);
if(root)
{
free(root);
}
system("pause");
return 0;
}