
#include "stdafx.h"
// 各種引用
#include#include#include#include#define NULL 0
int m_nNumOfLeaf=0; // 葉子結(jié)點(diǎn)數(shù)量
typedef char ElemType; //定義二叉樹(shù)結(jié)點(diǎn)中保存的數(shù)據(jù)的數(shù)據(jù)類(lèi)型
typedef struct BinaryNode //定義二叉樹(shù)結(jié)點(diǎn)的數(shù)據(jù)類(lèi)型
{ElemType data; //存放二叉樹(shù)結(jié)點(diǎn)數(shù)據(jù)
struct BinaryNode *lchild, *rchild; //存放二叉樹(shù)結(jié)點(diǎn)左右子樹(shù)的指針(指向的數(shù)據(jù)類(lèi)型是本身)
} BTNode;
BTNode * m_root= NULL; // 二叉樹(shù)指針(指向二叉樹(shù)的根結(jié)點(diǎn))
BTNode * CreatebBinaryTree()
{BTNode *T;
ElemType x;
scanf("%c",&x); // 獲取結(jié)點(diǎn)數(shù)據(jù)
if(x=='#') // 空結(jié)點(diǎn)
T=NULL;
else // 非空結(jié)點(diǎn)
{T=(BTNode*)malloc(sizeof(BTNode)); // 申請(qǐng)空間存儲(chǔ)結(jié)點(diǎn)
T->data=x; // 存儲(chǔ)數(shù)據(jù)
T->lchild=CreatebBinaryTree(); // 建立以本結(jié)點(diǎn)為根的左子樹(shù)
T->rchild=CreatebBinaryTree(); // 建立以本結(jié)點(diǎn)為根的右子樹(shù)
}
return(T); // 返回根結(jié)點(diǎn)
}
void PreOrderPrint(BTNode *t)
{if(t!=NULL) // 根結(jié)點(diǎn)不為空
{printf("%c\t",t->data); // 輸出根結(jié)點(diǎn)
PreOrderPrint(t->lchild); // 前序遍歷以本結(jié)點(diǎn)為根的左子樹(shù)
PreOrderPrint(t->rchild); // 前序遍歷以本結(jié)點(diǎn)為根的右子樹(shù)
}
}
void InOrderPrint(BTNode *t)
{if(t!=NULL) // 根結(jié)點(diǎn)不為空
{InOrderPrint(t->lchild); // 中序遍歷以本結(jié)點(diǎn)為根的左子樹(shù)
printf("%c\t",t->data); // 輸出根結(jié)點(diǎn)
InOrderPrint(t->rchild); // 中序遍歷以本結(jié)點(diǎn)為根的右子樹(shù)
}
}
void PostOrderPrint(BTNode *t)
{if(t!=NULL) // 根結(jié)點(diǎn)不為空
{
PostOrderPrint(t->lchild); // 后序遍歷以本結(jié)點(diǎn)為根的左子樹(shù)
PostOrderPrint(t->rchild); // 后序遍歷以本結(jié)點(diǎn)為根的右子樹(shù)
printf("%c\t",t->data); // 輸出根結(jié)點(diǎn)
}
}
void CalNumOfLeaf(BTNode *t)
{if(t!=NULL) // 根結(jié)點(diǎn)不為空
{if((t->lchild!=NULL)||(t->rchild!=NULL)) // 判斷該結(jié)點(diǎn)是否有左右子樹(shù)
{ CalNumOfLeaf(t->lchild); // 計(jì)算該結(jié)點(diǎn)左子樹(shù)的葉子結(jié)點(diǎn)數(shù)
CalNumOfLeaf(t->rchild); // 計(jì)算該結(jié)點(diǎn)右子樹(shù)的葉子結(jié)點(diǎn)數(shù)
}
else m_nNumOfLeaf++; // 是葉子結(jié)點(diǎn),則葉子結(jié)點(diǎn)數(shù)加1
}
}
int main(int argc, char* argv[]) // 主函數(shù)
{printf(" ***************************************\n");
printf(" 二叉樹(shù)操作\n");
printf(" ***************************************\n");
int flag = 1;
while(flag)
{printf("\n\n\t\t 1--建立\n");
printf("\t\t 2--前序遍歷\n");
printf("\t\t 3--中序遍歷\n");
printf("\t\t 4--后序遍歷\n");
printf("\t\t 5--葉子的數(shù)量\n");
printf("\t\t 0--退出程序\n");
printf("\t\t 程序編寫(xiě)人<姓名:%s ; 學(xué)號(hào):%s>\n","張三","123456789"); // 顯示 姓名和學(xué)號(hào)
scanf("%d",&flag);
switch(flag)
{ case 1: // 建立二叉樹(shù)
{ getchar(); // 獲取輸入的回車(chē)
printf("請(qǐng)輸入二叉樹(shù)各結(jié)點(diǎn)(前序順序,#代表空結(jié)點(diǎn)),形式如(AB###,ABC#####):\n"); // 輸出字符串
m_root = CreatebBinaryTree(); // 構(gòu)建二叉樹(shù)(前序)
printf("建立二叉樹(shù)完畢:\n"); // 輸出字符串
}
break;
case 2: // 前序遍歷
{ if(m_root == NULL) // 出錯(cuò)判斷
{printf("\n還沒(méi)有建立二叉樹(shù),無(wú)法進(jìn)行此操作!\n"); // 輸出字符串
}
else
{printf("\n二叉樹(shù)前序遍歷的順序?yàn)椋篭n"); // 輸出字符串
PreOrderPrint(m_root); // 前序遍歷輸出
printf("\n二叉樹(shù)前序遍歷結(jié)束:\n"); // 輸出字符串
}
}
break;
case 3: // 中序遍歷
{
if(m_root == NULL) // 出錯(cuò)判斷
{printf("\n還沒(méi)有建立二叉樹(shù),無(wú)法進(jìn)行此操作!\n"); // 輸出字符串
}
else
{printf("\n二叉樹(shù)中序遍歷的順序?yàn)椋篭n"); // 輸出字符串
InOrderPrint(m_root); // 中序遍歷輸出
printf("\n二叉樹(shù)中序遍歷結(jié)束:\n"); // 輸出字符串
}
}
break;
case 4: // 后序遍歷
{
if(m_root == NULL) // 出錯(cuò)判斷
{printf("\n還沒(méi)有建立二叉樹(shù),無(wú)法進(jìn)行此操作!\n"); // 輸出字符串
}
else
{printf("\n二叉樹(shù)后序遍歷的順序?yàn)椋篭n"); // 輸出字符串
PostOrderPrint(m_root); // 后序遍歷輸出
printf("\n二叉樹(shù)后序遍歷結(jié)束:\n"); // 輸出字符串
}
}
break;
case 5: // 計(jì)算葉子結(jié)點(diǎn)的數(shù)目
{ if(m_root == NULL) // 出錯(cuò)判斷
{printf("\n還沒(méi)有建立二叉樹(shù),無(wú)法進(jìn)行此操作!\n"); // 輸出字符串
}
else
{m_nNumOfLeaf=0; // 葉子結(jié)點(diǎn)數(shù)量初始化
CalNumOfLeaf(m_root); // 計(jì)算葉子結(jié)點(diǎn)數(shù)量
printf("\n當(dāng)前二叉樹(shù)中葉子數(shù)量為:%d\n",m_nNumOfLeaf); // 輸出字符串
}
}
break;
case 0: // 退出程序
break;
default: // 輸入錯(cuò)誤
printf("請(qǐng)輸入正確的數(shù)字!!!\n");
break;
}
}
return 0;
}
運(yùn)行結(jié)果
下載
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)的構(gòu)造與遍歷-創(chuàng)新互聯(lián)
地址分享:http://www.chinadenli.net/article10/dgeido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷(xiāo)推廣、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、小程序開(kāi)發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容