1.求二叉树叶子树
Status Leafamount(BiTree T)
{
int numl,numr;
if(T==NULL) return 0;
else
if((T->lchild==NULL)&&(T->rchild==NULL))
{
putchar(T->data);
printf("\n");
return 1;
}
else
{
numl=Leafamount(T->lchild);
numr=Leafamount(T->rchild);
return numr+numl;
}
}
2.求二叉树的深度
Status depth(BiTree T)
{
int depthl,depthr;
if(!T) return 0;
if(T->lchild==NULL&&T->rchild==NULL) return 1;
else
{
depthl=depth(T->lchild);
depthr=depth(T->rchild);
return (depthl>depthr? depthl:depthr)+1;
}
}
3.判断二叉树是否相等
Status Equal(BiTree T1,BiTree T2)//先序遍历判断两个二叉树是否相等
{
int flag;
if(T1==NULL&T2==NULL)
flag=1;
else if(T1==NULL||T2==NULL) flag=0;
else
{
if(T1->data==T2->data) flag=1;
else { flag=0; return flag;}
if(flag)
{
Equal(T1->lchild,T2->lchild);
Equal(T1->rchild,T2->rchild);
}
}
return flag;
}
4.二叉树左右孩子互换
Status Exchange(BiTree &T)
{
BiTree t;
if(T==NULL) return 0;
t=T->lchild;T->lchild=T->rchild;T->rchild=t;
Exchange(T->lchild);
Exchange(T->rchild);
}
5.判断二叉树是否为完全二叉树
不理解原理的可以参考完全二叉树的性质5
Status IsCompleteTree(BiTree T)//判断是否是完全二叉树
{
SqQueue Q ;
InitQueue(Q);
EnQueue(Q, T);
BiTree root=T;
while (root)
{
if (root->lchild)
EnQueue(Q, root->lchild);
else EnQueue(Q,NULL);
if(root->rchild)
EnQueue(Q, root->rchild);
else EnQueue(Q,NULL);
if(root==T) DeQueue(Q,root);
DeQueue(Q,root);
}
while(!QueueEmpty(Q))
{
DeQueue(Q,root);
if(root)
{
return FALSE;
}
}
return TRUE;
}
6.完整代码(包含遍历)
里面包含了用户自定义的一个头文件,还不知道怎么建立的快看看如何新建和调用用户自定义头文件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define TRUE 1
#define FALSE -1
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree,*QElemType;
#include"queue.h"
Status CreateBiTree(BiTree &T)
{
char ch;
ch=getchar();
if(ch==' ') T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) return OVERFLOW;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status PrintTElem(TElemType e)
{
putchar(e);
return OK;
}
Status PreTraverse(BiTree T,Status (* Visit)(TElemType e))
{
if(T)
{
if((*Visit)(T->data))
if(PreTraverse(T->lchild,Visit))
if(PreTraverse(T->rchild,Visit))
return OK;
return ERROR;
}
else return OK;
}
Status MidTraverse(BiTree T,Status (* Visit)(TElemType e))
{
if(T)
{
if(MidTraverse(T->lchild,Visit))
if((*Visit)(T->data))
if(MidTraverse(T->rchild,Visit))
return OK;
return ERROR;
}
else return OK;
}
Status LastTraverse(BiTree T,Status (* Visit)(TElemType e))
{
if(T)
{
if(LastTraverse(T->lchild,Visit))
if(LastTraverse(T->rchild,Visit))
if((*Visit)(T->data))
return OK;
return ERROR;
}
else return OK;
}
Status Leafamount(BiTree T)
{
int numl,numr;
if(T==NULL) return 0;
else
if((T->lchild==NULL)&&(T->rchild==NULL))
{
printf("叶子节点:");
putchar(T->data);
printf("\n");
return 1;
}
else
{
numl=Leafamount(T->lchild);
numr=Leafamount(T->rchild);
return numr+numl;
}
}
Status depth(BiTree T)
{
int depthl,depthr;
if(!T) return 0;
if(T->lchild==NULL&&T->rchild==NULL) return 1;
else
{
depthl=depth(T->lchild);
depthr=depth(T->rchild);
return (depthl>depthr? depthl:depthr)+1;
}
}
Status Equal(BiTree T1,BiTree T2)//先序遍历判断两个二叉树是否相等
{
int flag;
if(T1==NULL&T2==NULL)
flag=1;
else if(T1==NULL||T2==NULL) flag=0;
else
{
if(T1->data==T2->data) flag=1;
else { flag=0; return flag;}
if(flag)
{
Equal(T1->lchild,T2->lchild);
Equal(T1->rchild,T2->rchild);
}
}
return flag;
}
Status Exchange(BiTree &T)
{
BiTree t;
if(T==NULL) return 0;
t=T->lchild;T->lchild=T->rchild;T->rchild=t;
Exchange(T->lchild);
Exchange(T->rchild);
}
void SeqTraverse(BiTree T)
{
SqQueue Q ;
InitQueue(Q);
EnQueue(Q, T);
BiTree root;
while (!QueueEmpty(Q))
{
DeQueue(Q,root);
putchar(root->data);
if (root->lchild)
EnQueue(Q, root->lchild);
if(root->rchild)
EnQueue(Q, root->rchild);
}
}
Status IsCompleteTree(BiTree T)//判断是否是完全二叉树
{
SqQueue Q ;
InitQueue(Q);
EnQueue(Q, T);
BiTree root=T;
while (root)
{
if (root->lchild)
EnQueue(Q, root->lchild);
else EnQueue(Q,NULL);
if(root->rchild)
EnQueue(Q, root->rchild);
else EnQueue(Q,NULL);
if(root==T) DeQueue(Q,root);
DeQueue(Q,root);
}
while(!QueueEmpty(Q))
{
DeQueue(Q,root);
if(root)
{
return FALSE;
}
}
return TRUE;
}
int main()
{
BiTree T;
printf("请输入二叉树的先序序列(含空指针):");
CreateBiTree(T);
SeqTraverse(T);
int i=IsCompleteTree(T);
if(i==1) printf("是完全二叉树");
else printf("不是完全二叉树");
//Exchange(T);
//PreTraverse(T,PrintTElem);
return 0;
}
/*int main()
{
int i;
char ch;
BiTree T1,T2;
CreateBiTree(T2);
PreTraverse(T2,PrintTElem);
putchar(getchar());
CreateBiTree(T1);
PreTraverse(T1,PrintTElem);
i=Equal(T1,T2);
if(i==1) printf("两棵树相等");
if(i==0) printf("两棵树不同");
}
int main()
{
int k;
BiTree T;
CreateBiTree(T);
LastTraverse(T,PrintTElem);
printf("\n");
printf("叶子数为:%d\n",Leafamount(T));
printf("深度为:%d",depth(T));
return 0;
}
*/
头文件queue.h的代码
#define STACK_INIT_SIZE 100
#define MAXQSIZE 100
typedef char TElemType;
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
Status QueueEmpty(SqQueue Q)
{
if(Q.rear==Q.front)
return OK;
else return ERROR;
}
Status InitQueue(SqQueue &Q)
{
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) return OVERFLOW;
Q.front=Q.rear=0;
return OK;
}
int QueneLength(SqQueue Q)
{
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status EnQueue (SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}