C語言數據結構二叉樹簡單應用
在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。本文是本站小編搜索整理的關於C語言數據結構二叉樹簡單應用的相關資料,供參考學習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!
通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree),接下來我就在這裏給大家介紹一下二叉樹在算法中的簡單使用:
我們要完成總共有
(1)二叉樹的創建
(2)二叉樹的先中後序遞歸遍歷
(3)統計葉子結點的總數
(4)求樹的高度
(5)反轉二叉樹
(6)輸出每個葉子結點到根節點的.路徑
(7)輸出根結點到每個葉子結點的路徑。
定義二叉樹結點類型的結構體
typedef struct node{
char data;
struct node *Lchild;
struct node *Rchild;
}BiTNode,*BiTree;
int cnt=0;//統計葉子節點個數
二叉樹的創建
BiTNode *Create(){ //二叉樹的先序建立
char ch;
BiTNode *s;
ch=getchar();
if(ch=='#')erchashu
return NULL;
s=(BiTNode *)malloc(sizeof(BiTNode));
s->data=ch;
s->Lchild=Create();
s->Rchild=Create();
return s;
}
二叉樹的先序、中序、後序遞歸遍歷
void PreOrder(BiTree root){ //前序遍歷
if(root){
printf("%c ",root->data);
PreOrder(root->Lchild);
PreOrder(root->Rchild);
}
}
void InOrder(BiTree root){ //中序遍歷
if(root){
InOrder(root->Lchild);
printf("%c ",root->data);
InOrder(root->Rchild);
}
}
void PostOrder(BiTree root){ //後序遍歷
if(root){
PostOrder(root->Lchild);
PostOrder(root->Rchild);
printf("%c ",root->data);
}
}
統計葉子結點個數:
void LeafCountNode(BiTree root){ //統計葉子結點個數
if(root){
if(!root->Lchild && !root->Rchild)
cnt++;
LeafCountNode(root->Lchild);
LeafCountNode(root->Rchild);
}
}
輸出各個葉子結點值:
void IInOrder(BiTree root){ //輸出各個葉子結點值
if(root){
IInOrder(root->Lchild);
if(!root->Lchild && !root->Rchild)
printf("%c ",root->data);
IInOrder(root->Rchild);
}
}
求樹的高度:
int PostTreeDepth(BiTree root){ //求樹的高度
int h1,h2,h;
if(root==NULL){
return 0;
}
else{
h1=PostTreeDepth(root->Lchild);
h2=PostTreeDepth(root->Rchild);
h=(h1>h2?h1:h2)+1;
return h;
}
}
反轉二叉樹:
void MirrorTree(BiTree root){ //二叉樹鏡像樹
BiTree t;
if(root==NULL)
return;
else{
t=root->Lchild;
root->Lchild=root->Rchild;
root->Rchild=t;
MirrorTree(root->Lchild);
MirrorTree(root->Rchild);
}
}
輸出每個葉子結點到根節點的路徑:
void OutPutPath(BiTree root,char path[],int len){ //輸出每個葉子結點到根節點的路徑
if(root){
if(!root->Lchild && !root->Rchild){
printf("%c ",root->data);
for(int i=len-1;i>=0;i--)
printf("%c ",path[i]);
printf("n");
}
path[len]=root->data;
OutPutPath(root->Lchild,path,len+1);
OutPutPath(root->Rchild,path,len+1);
}
}
輸出根到每個葉子結點的路徑:
void PrintPath(BiTree root,char path[],int l){ //輸出根到每個葉子結點的路徑
int len=l-1;
if(root){
if(root->Lchild==NULL && root->Rchild==NULL){
path[len]=root->data;
for(int i=9;i>=len;i--)
printf("%c ",path[i]);
printf("n");
}
path[len]=root->data;
PrintPath(root->Lchild,path,len);
PrintPath(root->Rchild,path,len);
}
}
測試代碼:
int main(void){
int h,len;
char path[20];
BiTree root;
root=Create();
// PreOrder(root);
// printf("n");
// InOrder(root);
// printf("n");
// PostOrder(root);
// printf("n");
// LeafCountNode(root);
// printf("葉子結點個數為:%dn",cnt);
// IInOrder(root);
h=PostTreeDepth(root);
printf("樹的高度為:High=%dn",h);
// PrintTree(root,0);
// MirrorTree(root);
// PrintTree(root,0);
// OutPutPath(root,path,0);
// PrintPath(root,path,10);
return 0;
}
-
C語言程序基礎練習題帶答案
C語言傳遞參數均是以值傳遞(passbyvalue),另外也可以傳遞指針(apointerpassedbyvalue)。下面是小編為大家搜索整理的C語言專項訓練題,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!單選題1).下列關於標識符的説法中錯誤的是A.合法的標識符...
-
C語言在屏幕中顯示內容
C語言你瞭解多少呢?你知道C語言在屏幕中顯示內容是什麼樣的嗎?歡迎大家閲讀!更多相關信息請關注相關欄目!我們有兩種方式從計算機獲得信息:一是看屏幕上的文字、圖片、視頻等,二是聽從喇叭發出來的聲音。讓喇叭發出聲音目前還比較麻煩,我們先來看看如何在屏幕上顯示一...
-
C語言基礎循環結構
引導語:循環結構可以減少源程序重複書寫的工作量,用來描述重複執行某段算法的問題,這是程序設計中最能發揮計算機特長的程序結構。以下是本站小編分享給大家的C語言循環結構,歡迎閲讀學習!1.1for循環結構循環語句的一般表達式是:for(表達式1;表達式2;表達式3)語句2....
-
C語言猴子吃桃問題
猴子第一天摘了若干個桃子,當即吃了一半,還不解饞,又多吃了一個;第二天,吃剩下的桃子的一半,還不過癮,又多吃了一個;以後每天都吃前一天剩下的一半多一個,到第10天想再吃時,只剩下一個桃子了。問第一天共摘了多少個桃子?分析:1)設x1為前一天桃子數,設x2為第二天桃子數,則:x...