二叉樹的遍曆是典型的遞迴演算法。所謂樹的遍曆是指按某條搜尋路徑訪問樹中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。我的程式給出了二叉樹的先序遍曆,中序遍曆,後序遍曆和求二叉樹的深度。程式如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAX(a,b) (a>b?a:b)
typedef char TElemType;
typedef int Status;
//二叉樹的二叉鏈表格儲存體結構
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍曆產生二叉樹
Status CreatBiTree(BiTree &T){
TElemType ch,temp;
printf("輸入一個元素: ");
scanf("%c",&ch);
temp=getchar(); //結束斷行符號
if(ch==' ') T=NULL; //輸入空格表示結點為空白樹
else{
if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; //產生根結點
CreatBiTree(T->lchild); //構造左子樹
CreatBiTree(T->rchild); //構造右子樹
}
return OK;
}
//列印元素
Status PrintElem(TElemType e){
printf("%c ",e);
return OK;
}
//先序遍曆二叉樹
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){ //二叉樹不為空白時
if(Visit(T->data)) //訪問根結點
if(PreOrderTraverse(T->lchild,Visit)) //先序遍曆左子樹
if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍曆右子樹
return ERROR;
}
else return OK;
}
//中序遍曆二叉樹
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit)) return OK;
else return ERROR;
}
return OK;
}
//後序遍曆二叉樹
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){
if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data)) return OK;
else return ERROR;
}
return OK;
}
//求二叉樹的深度
int BiTreeDepth(BiTree T){
if(!T) return 0; //二叉樹為空白樹時
int Dl=0,Dr=0;
if(T->lchild) Dl=BiTreeDepth(T->lchild); //求左子樹深度
if(T->rchild) Dr=BiTreeDepth(T->rchild); //求右子樹深度
return MAX(Dl,Dr)+1;
}
//主函數
void main()
{
BiTree T;
Status (* Visit)(TElemType);
Visit=PrintElem;
CreatBiTree(T);
printf("/n先序遍曆:");
PreOrderTraverse(T,Visit);
printf("/n中序遍曆:");
InOrderTraverse(T,Visit);
printf("/n後序遍曆:");
PostOrderTraverse(T,Visit);
printf("/n二叉樹深度為%d",BiTreeDepth(T));
printf("/n程式結束./n");
}
輸出結果為(紅色為鍵盤輸入的資料,輸入的空格沒有顯示出來):
輸入一個元素: A
輸入一個元素: B
輸入一個元素: C
輸入一個元素:
輸入一個元素:
輸入一個元素: D
輸入一個元素: E
輸入一個元素:
輸入一個元素: G
輸入一個元素:
輸入一個元素:
輸入一個元素: F
輸入一個元素:
輸入一個元素:
輸入一個元素:
先序遍曆:A B C D E G F
中序遍曆:C B E G D F A
後序遍曆:C G E F D B A
二叉樹深度為5
程式結束.