二叉樹的操作
#include <stdlib
#include <stdio
#define queuesize
#define null
typedef char datatype;
typedef struct node{
datatype data;
struct node *lchild
}bintnode;//定義二叉鏈表結點結構
typedef bintnode *bintree;//定義二叉鏈表指針類型
typedef struct{
int front
bintree data[queuesize];//循環隊列元素類型為二叉鏈表結點指針
int count;
}cirqueue;//循環隊列結構定義
main()//主函數
{//建立二叉樹的二叉鏈表表示
//求出所有葉子和結點總數
bintree t=null;
int n;
printf(
createbintree(&t);//建立二叉鏈表
printf(
preorder(t);//對二叉樹t進行先序遍歷
printf(
printf(
inorder(t);//對二叉樹t進行中序遍歷
printf(
postorder(t);//對二叉樹t進行後序遍歷
printf(
leverorder(t);//對二叉樹t進行按層次遍歷
n=leave(t);// 求出二叉樹的葉子數n
printf(
if (n){//當葉子數不為
printf(
leavelist(t);//輸出所有的葉子
}
else
printf(
printf(
}
createbintree(bintree *t)
{//輸入二叉樹的先序遍歷序列
char ch;
if ((ch=getchar())==
*t=null;
else{
*t=(bintnode*)malloc(sizeof(bintnode));//申請根結點*t空間
(*t)
createbintree(&(*t)
createbintree(&(*t)
}//end of if
}//end of creatbintree
preorder(bintree t)
{//對二叉樹進行先序遍歷
if (t){
printf(
preorder(t
preorder(t
}//end of if
}//end of preorder
inorder(bintree t)
{//對二叉樹進行中序遍歷
if (t){
inorder(t
printf(
inorder(t
}//end of if
}//end of inorder
postorder(bintree t)
{//對二叉樹進行後序遍歷
if (t){
postorder(t
postorder(t
printf(
}//end of if
}//end of postorder
error(char *message)
{//出錯時
fprintf(stderr
exit(
}
leverorder(bintree t)
{
cirqueue *q;
bintree p;
q=(cirqueue*)malloc(sizeof(cirqueue));//申請循環隊列空間
q
q
while (q
if (q
p=q
printf(
q
if (q
error(
else{//若隊列不滿
q
q
}//enf of if
if (q
error(
else{//若隊列不滿
q
q
}//end of if
}//end of if
else{//當隊首元素為空指針
q
}//end of leverorder
int leave(bintree t)
{//求以t為樹根的二叉樹的葉子總數
if (!t)//若根結點為
return
else//若根結點非空
if ((t
return
else //根結點的左
return(leave(t
//葉子數為左子樹的葉子數加右子樹中的葉子數
}
leavelist(bintree t)
{
if (t){
leavelist(t
if ((t
//若根結點為葉子
printf(
leavelist(t
}//end of if
}//end of inorder
int nodes(bintree t)
{
if (!t)//若二叉樹為空樹
return
else //若二叉樹非空
return nodes(t
//二叉樹的結點總數為左
}//end of node
From:http://tw.wingwit.com/Article/program/sjjg/201311/23277.html