檔案main.cpp程式碼如下:
#include<malloc.h>//malloc()等
#include<stdio.h>//標準輸入輸出標頭檔案,包括EOF(=^Z或F6),NULL等
#include<stdlib.h>//atoi(),exit()
#include<math.h>//數學函式標頭檔案,包括floor(),ceil(),abs()等
#defineClearBiTreeDestroyBiTree//清空二叉樹和銷燬二叉樹的操作一樣
typedefstructBiTNode
{
intdata;//結點的值
BiTNode*lchild,*rchild;//左右孩子指標
}BiTNode,*BiTree;
intNil=0;//設整型以0為空
voidvisit(inte)
{printf("%d",e);//以整型格式輸出
}
voidInitBiTree(BiTree&T)
{//操作結果:構造空二叉樹T
T=NULL;
voidCreateBiTree(BiTree&T)
{//演算法6.4:按先序次序輸入二叉樹中結點的值(可為字元型或整型,在主程中定義),
//構造二叉連結串列表示的二叉樹T。變數Nil表示空(子)樹。修改
intnumber;
scanf("%d",&number);//輸入結點的值
if(number==Nil)//結點的值為空
else//結點的值不為空
{T=(BiTree)malloc(sizeof(BiTNode));//生成根結點
if(!T)
exit(OVERFLOW);
T->data=number;//將值賦給T所指結點
CreateBiTree(T->lchild);//遞迴構造左子樹
CreateBiTree(T->rchild);//遞迴構造右子樹
voidDestroyBiTree(BiTree&T)
{//初始條件:二叉樹T存在。操作結果:銷燬二叉樹T
if(T)//非空樹
{DestroyBiTree(T->lchild);//遞迴銷燬左子樹,如無左子樹,則不執行任何操作
DestroyBiTree(T->rchild);//遞迴銷燬右子樹,如無右子樹,則不執行任何操作
free(T);//釋放根結點
T=NULL;//空指標賦0
voidPreOrderTraverse(BiTreeT,void(*Visit)(int))
{//初始條件:二叉樹T存在,Visit是對結點操作的應用函式。修改演算法6.1
//操作結果:先序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
if(T)//T不空
{Visit(T->data);//先訪問根結點
PreOrderTraverse(T->lchild,Visit);//再先序遍歷左子樹
PreOrderTraverse(T->rchild,Visit);//最後先序遍歷右子樹
voidInOrderTraverse(BiTreeT,void(*Visit)(int))
{//初始條件:二叉樹T存在,Visit是對結點操作的應用函式
//操作結果:中序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
if(T)
{InOrderTraverse(T->lchild,Visit);//先中序遍歷左子樹
Visit(T->data);//再訪問根結點
InOrderTraverse(T->rchild,Visit);//最後中序遍歷右子樹
voidPostOrderTraverse(BiTreeT,void(*Visit)(int))
//操作結果:後序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
{PostOrderTraverse(T->lchild,Visit);//先後序遍歷左子樹
PostOrderTraverse(T->rchild,Visit);//再後序遍歷右子樹
Visit(T->data);//最後訪問根結點
voidmain()
BiTreeT;
InitBiTree(T);//初始化二叉樹T
printf("按先序次序輸入二叉樹中結點的值,輸入0表示節點為空,輸入範例:1200300\n");
CreateBiTree(T);//建立二叉樹T
printf("先序遞迴遍歷二叉樹:\n");
PreOrderTraverse(T,visit);//先序遞迴遍歷二叉樹T
printf("\n中序遞迴遍歷二叉樹:\n");
InOrderTraverse(T,visit);//中序遞迴遍歷二叉樹T
printf("\n後序遞迴遍歷二叉樹:\n");
PostOrderTraverse(T,visit);//後序遞迴遍歷二叉樹T
檔案main.cpp程式碼如下:
#include<malloc.h>//malloc()等
#include<stdio.h>//標準輸入輸出標頭檔案,包括EOF(=^Z或F6),NULL等
#include<stdlib.h>//atoi(),exit()
#include<math.h>//數學函式標頭檔案,包括floor(),ceil(),abs()等
#defineClearBiTreeDestroyBiTree//清空二叉樹和銷燬二叉樹的操作一樣
typedefstructBiTNode
{
intdata;//結點的值
BiTNode*lchild,*rchild;//左右孩子指標
}BiTNode,*BiTree;
intNil=0;//設整型以0為空
voidvisit(inte)
{printf("%d",e);//以整型格式輸出
}
voidInitBiTree(BiTree&T)
{//操作結果:構造空二叉樹T
T=NULL;
}
voidCreateBiTree(BiTree&T)
{//演算法6.4:按先序次序輸入二叉樹中結點的值(可為字元型或整型,在主程中定義),
//構造二叉連結串列表示的二叉樹T。變數Nil表示空(子)樹。修改
intnumber;
scanf("%d",&number);//輸入結點的值
if(number==Nil)//結點的值為空
T=NULL;
else//結點的值不為空
{T=(BiTree)malloc(sizeof(BiTNode));//生成根結點
if(!T)
exit(OVERFLOW);
T->data=number;//將值賦給T所指結點
CreateBiTree(T->lchild);//遞迴構造左子樹
CreateBiTree(T->rchild);//遞迴構造右子樹
}
}
voidDestroyBiTree(BiTree&T)
{//初始條件:二叉樹T存在。操作結果:銷燬二叉樹T
if(T)//非空樹
{DestroyBiTree(T->lchild);//遞迴銷燬左子樹,如無左子樹,則不執行任何操作
DestroyBiTree(T->rchild);//遞迴銷燬右子樹,如無右子樹,則不執行任何操作
free(T);//釋放根結點
T=NULL;//空指標賦0
}
}
voidPreOrderTraverse(BiTreeT,void(*Visit)(int))
{//初始條件:二叉樹T存在,Visit是對結點操作的應用函式。修改演算法6.1
//操作結果:先序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
if(T)//T不空
{Visit(T->data);//先訪問根結點
PreOrderTraverse(T->lchild,Visit);//再先序遍歷左子樹
PreOrderTraverse(T->rchild,Visit);//最後先序遍歷右子樹
}
}
voidInOrderTraverse(BiTreeT,void(*Visit)(int))
{//初始條件:二叉樹T存在,Visit是對結點操作的應用函式
//操作結果:中序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
if(T)
{InOrderTraverse(T->lchild,Visit);//先中序遍歷左子樹
Visit(T->data);//再訪問根結點
InOrderTraverse(T->rchild,Visit);//最後中序遍歷右子樹
}
}
voidPostOrderTraverse(BiTreeT,void(*Visit)(int))
{//初始條件:二叉樹T存在,Visit是對結點操作的應用函式
//操作結果:後序遞迴遍歷T,對每個結點呼叫函式Visit一次且僅一次
if(T)//T不空
{PostOrderTraverse(T->lchild,Visit);//先後序遍歷左子樹
PostOrderTraverse(T->rchild,Visit);//再後序遍歷右子樹
Visit(T->data);//最後訪問根結點
}
}
voidmain()
{
BiTreeT;
InitBiTree(T);//初始化二叉樹T
printf("按先序次序輸入二叉樹中結點的值,輸入0表示節點為空,輸入範例:1200300\n");
CreateBiTree(T);//建立二叉樹T
printf("先序遞迴遍歷二叉樹:\n");
PreOrderTraverse(T,visit);//先序遞迴遍歷二叉樹T
printf("\n中序遞迴遍歷二叉樹:\n");
InOrderTraverse(T,visit);//中序遞迴遍歷二叉樹T
printf("\n後序遞迴遍歷二叉樹:\n");
PostOrderTraverse(T,visit);//後序遞迴遍歷二叉樹T
}