#include <stdio.h>
#include <stdlib.h>
typedef struct BNode
{
int data;
struct BNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatTree(BiTree *T); //创建一个二叉树
void welcome(); //欢迎界面
void PreOrderTraverse(BiTree T); //前序遍历
void InOrderTraverse(BiTree T); //中序遍历
void PostOrderTraverse(BiTree T); //后序遍历
void LevelTraverse(BiTNode *b); //层次遍历
int LeaveNode(BiTree T); //求叶子节点个数
int AllNode(BiTree T); //求所有节点个数
int TreeDeep(BiTree T); //求二叉树的深度
int GetMax(BiTree T); //最大元
int GetMin(BiTree T); //最小元
void main()
{
BiTree T;
printf("创建二叉树\n");
CreatTree(&T);
printf("前序遍历:\n");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历:\n");
InOrderTraverse(T);
printf("\n");
printf("后序遍历:\n");
PostOrderTraverse(T);
printf("\n");
printf("层次遍历:\n");
LevelTraverse(T);
printf("\n");
printf("叶子节点数=%d\n",LeaveNode(T));
printf("总节点数=%d\n",AllNode(T));
printf("该树的深度=%d\n",TreeDeep(T));
printf("最大元=%d",GetMax(T));
printf("\n");
printf("最小元=%d",GetMin(T));
printf("\n");
}
void welcome()
{
printf("1.创建二叉树\n");
printf("2.前序遍历\n");
printf("3.中序遍历\n");
printf("4.后序遍历\n");
printf("5.层次遍历\n");
printf("6.叶节点和所有节点个数、深度\n");
printf("0.退出\n");
}
void CreatTree(BiTree *T)
{
int num;
printf("Please input a data:");
scanf(" %d",&num);
if(num==-1){ //-1表示子节点为空
*T = NULL;
}else{
(*T) = (BiTree)malloc(sizeof(BiTNode));
if(!*T){
printf("Error! No enough memory!");
exit(0);
}
(*T)->data = num;
CreatTree(&(*T)->lchild);
CreatTree(&(*T)->rchild);
}
}
void PreOrderTraverse(BiTree T) //前序遍历
{
if(T!=NULL)
{
printf(" %d",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T!=NULL){
InOrderTraverse(T->lchild);
printf(" %d",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if(T!=NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf(" %d",T->data);
}
}
//采用栈结构来实现层次遍历
void LevelTraverse(BiTree T){
int flag=0; //控制打印的换行问题
BiTree p;
BiTree qu[40];
int front,rear;
front =rear=-1;
rear++;
qu[rear]=T;
while(front !=rear)
{
front++;
p=qu[front];
printf("%d ",p->data);
if(p->lchild)
{
printf("\n");
flag=0;
rear++;
qu[rear]=p->lchild;
}
if(p->rchild)
{
if(flag==1)
printf("\n");
rear++;
qu[rear]=p->rchild;
flag=1;
}
}
}
/*
求叶节点个数
*/
int LeaveNode(BiTree T){
static int num=0;
if(T)
{
if(T->lchild ==NULL &&T->rchild==NULL)
num++;
LeaveNode(T->lchild);
LeaveNode(T->rchild);
}
return num;
}
/*
求树的深度
*/
int TreeDeep(BiTree T)
{
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lchild);
int rightdeep = TreeDeep(T->rchild);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
/*
求总的节点个数
*/
int AllNode(BiTree T){
if(T==NULL)
return 0;
return 1+AllNode(T->lchild)+AllNode(T->rchild);
}
int GetMax(BiTree T)
{
static int max=0;
if(T!=NULL){
if(max<T->data) max=T->data;
GetMax(T->lchild);
GetMax(T->rchild);
}
return max;
}
int GetMin(BiTree T)
{
static int min=99999999;
if(T!=NULL){
if(T->data<min) min=T->data;
GetMin(T->lchild);
GetMin(T->rchild);
}
return min;
}
#include <stdlib.h>
typedef struct BNode
{
int data;
struct BNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatTree(BiTree *T); //创建一个二叉树
void welcome(); //欢迎界面
void PreOrderTraverse(BiTree T); //前序遍历
void InOrderTraverse(BiTree T); //中序遍历
void PostOrderTraverse(BiTree T); //后序遍历
void LevelTraverse(BiTNode *b); //层次遍历
int LeaveNode(BiTree T); //求叶子节点个数
int AllNode(BiTree T); //求所有节点个数
int TreeDeep(BiTree T); //求二叉树的深度
int GetMax(BiTree T); //最大元
int GetMin(BiTree T); //最小元
void main()
{
BiTree T;
printf("创建二叉树\n");
CreatTree(&T);
printf("前序遍历:\n");
PreOrderTraverse(T);
printf("\n");
printf("中序遍历:\n");
InOrderTraverse(T);
printf("\n");
printf("后序遍历:\n");
PostOrderTraverse(T);
printf("\n");
printf("层次遍历:\n");
LevelTraverse(T);
printf("\n");
printf("叶子节点数=%d\n",LeaveNode(T));
printf("总节点数=%d\n",AllNode(T));
printf("该树的深度=%d\n",TreeDeep(T));
printf("最大元=%d",GetMax(T));
printf("\n");
printf("最小元=%d",GetMin(T));
printf("\n");
}
void welcome()
{
printf("1.创建二叉树\n");
printf("2.前序遍历\n");
printf("3.中序遍历\n");
printf("4.后序遍历\n");
printf("5.层次遍历\n");
printf("6.叶节点和所有节点个数、深度\n");
printf("0.退出\n");
}
void CreatTree(BiTree *T)
{
int num;
printf("Please input a data:");
scanf(" %d",&num);
if(num==-1){ //-1表示子节点为空
*T = NULL;
}else{
(*T) = (BiTree)malloc(sizeof(BiTNode));
if(!*T){
printf("Error! No enough memory!");
exit(0);
}
(*T)->data = num;
CreatTree(&(*T)->lchild);
CreatTree(&(*T)->rchild);
}
}
void PreOrderTraverse(BiTree T) //前序遍历
{
if(T!=NULL)
{
printf(" %d",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if(T!=NULL){
InOrderTraverse(T->lchild);
printf(" %d",T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
if(T!=NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf(" %d",T->data);
}
}
//采用栈结构来实现层次遍历
void LevelTraverse(BiTree T){
int flag=0; //控制打印的换行问题
BiTree p;
BiTree qu[40];
int front,rear;
front =rear=-1;
rear++;
qu[rear]=T;
while(front !=rear)
{
front++;
p=qu[front];
printf("%d ",p->data);
if(p->lchild)
{
printf("\n");
flag=0;
rear++;
qu[rear]=p->lchild;
}
if(p->rchild)
{
if(flag==1)
printf("\n");
rear++;
qu[rear]=p->rchild;
flag=1;
}
}
}
/*
求叶节点个数
*/
int LeaveNode(BiTree T){
static int num=0;
if(T)
{
if(T->lchild ==NULL &&T->rchild==NULL)
num++;
LeaveNode(T->lchild);
LeaveNode(T->rchild);
}
return num;
}
/*
求树的深度
*/
int TreeDeep(BiTree T)
{
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lchild);
int rightdeep = TreeDeep(T->rchild);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
/*
求总的节点个数
*/
int AllNode(BiTree T){
if(T==NULL)
return 0;
return 1+AllNode(T->lchild)+AllNode(T->rchild);
}
int GetMax(BiTree T)
{
static int max=0;
if(T!=NULL){
if(max<T->data) max=T->data;
GetMax(T->lchild);
GetMax(T->rchild);
}
return max;
}
int GetMin(BiTree T)
{
static int min=99999999;
if(T!=NULL){
if(T->data<min) min=T->data;
GetMin(T->lchild);
GetMin(T->rchild);
}
return min;
}