主要代碼
#include <stdio.h>
#include <stdlib.h>
#define ElemType char //二叉樹中數據元素類型
#include "bintree.h" //二叉樹的實現
Status print(char);
int LeafCount(BiTree bt);
int Deapth(BiTree bt);
void PrintTreeIndent(BiTree bt, int indent);
void LeafCount2(BiTree bt, int &count);
Status change(BiTree bt);
void main()
{
BiTree bt = 0;
int count=0 ;
printf("建立二叉樹(按先序輸入二叉樹中的結點,空格表示空樹)\n");
if( CreateBiTree(bt)==ERROR ) {
printf("ERROR: call CreateBiTree\n");
system("pause");
exit(1);
}
PrintTree(bt);
printf("\n先序遍歷: ");
if( PreOrderTraverse(bt,print)==ERROR )
printf("ERROR: call PreOrderTraverse\n");
printf("\n中序遍歷: ");
if( InOrderTraverse(bt,print)==ERROR )
printf("ERROR: call InOrderTraverse\n");
printf("\n後序遍歷: ");
if( PostOrderTraverse(bt,print)==ERROR )
printf("ERROR: call PostOrderTraverse\n");
printf("\n按層遍歷: ");
if( LevelOrderTraverse(bt,print)==ERROR )
printf("ERROR: call LevelOrderTraverse\n");
printf("\n方法一求二叉樹中葉子結點的個數: %d\n", LeafCount(bt));
LeafCount2(bt,count);
printf("\n方法二求二叉樹中葉子結點的個數%d",count);
printf("\n二叉樹的深度: %d\n", Deapth(bt));
printf("\n按縮進形式打印:\n");
PrintTreeIndent(bt,1);
printf("\n交換左右子樹以後打印效果\n");
change(bt);
PrintTree(bt);
DestroyBiTree(bt);
system("pause");
}
Status print(char ch)
{
putchar(ch);
return OK;
}
int LeafCount(BiTree bt)
{
int L,R;
if(!bt) return 0;
if(!(bt->lchild)&&!(bt->rchild)){
return 1;
}
L=LeafCount(bt->lchild);
R=LeafCount(bt->rchild);
return L+R;
}
void LeafCount2(BiTree bt, int &count)
{
if(bt) {
if(!(bt->lchild)&&!(bt->rchild)){
count++;
}
LeafCount2(bt->lchild,count);
LeafCount2(bt->rchild,count);
}
}
int Deapth(BiTree bt)
{
int L,R;
if(!bt){return 0;}
L=Deapth(bt->lchild);
R=Deapth(bt->rchild);
return 1+max(L,R);
}
void PrintTreeIndent(BiTree bt, int indent)
{
int i;
if (bt)
{
for (i=1; i<indent; i++) printf(" ");
printf("%c\n", bt->data);
PrintTreeIndent (bt->lchild, indent+3);
PrintTreeIndent (bt->rchild, indent+3);
}
}
Status change(BiTree bt){
BiTree t;
if(!bt){
return ERROR;
}
t=bt->lchild;
bt->lchild=bt->rchild;
bt->rchild=t;
change(bt->lchild);
change(bt->rchild);
}
#ifndef BINTREE_H_INCLUDED
#define BINTREE_H_INCLUDED
#include <stdlib.h>
#include "ds.h"
#ifndef ElemType
#define ElemType char
#define ELEMTYPE_TAG
#endif
#define TElemType ElemType
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
BiTree MakeNode(TElemType e, BiTree lch, BiTree rch)
{
BiTree p = (BiTree)malloc(sizeof(BiTNode));
p->data = e;
p->lchild = lch;
p->rchild = rch;
return p;
}
Status CreateBiTree(BiTree &T)
{
char ch;
read(ch);
if( ch==' ' )
T = 0;
else {
T=MakeNode(ch, NULL, NULL);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status DestroyBiTree(BiTree &T)
{
return ERROR;
}
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType))
{
if(!T) return OK;
else{
Visit(T->data);
PreOrderTraverse(T->lchild, Visit);
PreOrderTraverse(T->rchild, Visit);
return OK;
}
return ERROR;
}
Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType))
{
if(!T) return OK;
else{
InOrderTraverse(T->lchild, Visit);
Visit(T->data);
InOrderTraverse(T->rchild, Visit);
return OK;
}
return ERROR;
}
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType))
{
if(!T) return OK;
else{
PostOrderTraverse(T->lchild, Visit);
PostOrderTraverse(T->rchild, Visit);
Visit(T->data);
return OK;
}
return ERROR;
}
Status LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType))
{
BiTree Q[100];
int front=0,rear=0;
if(!T)
return ERROR;
else
{
Visit(T->data);
Q[rear]=T; rear=(rear+1)%100;
while(front!=rear){
BiTree p=Q[front];
front=(front+1)%100;
if(p->lchild){
Visit(p->lchild->data);
Q[rear]=p->lchild;
rear=(rear+1)%100;
}
if(p->rchild){
Visit(p->rchild->data);
Q[rear]=p->rchild;
rear=(rear+1)%100;
}
}
}
return OK;
}
void PrintTree(BiTree t, int level=0)
{
int i;
if(t) {
PrintTree(t->rchild, level+1);
for(i=0; i<level; i++) printf(" ");
write(t->data); write('\n');
PrintTree(t->lchild, level+1);
}
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif //BINTREE_H_INCLUDED
演示效果圖