如果用鍊錶來儲存二叉樹,那麼可以將二叉樹定義如下:
問題一:二叉樹的深度typedef char elemtype;
typedef struct nodebtnode;
二叉樹的深度,也叫二叉樹的高度,二叉樹的深度等於從根結點到葉子結點的最長路徑加1。用遞迴的觀點來看,二叉樹的深度,等於其最大左右子樹的深度加1,而每個左子樹(右子樹)又可以分解為次左子樹+次右子樹,它們是深度也是最大子樹深度加1。也就是二叉樹深度的遞迴模型f(b)如下: +1
,其他情況
\begin f(b)=0, & \text \\ f(b)=max\+1, & \text \end
+1,
若b=null
其他情況
對應的遞迴演算法如下:
問題二:二叉樹的寬度//求二叉樹b的深度
int btnodedepth(btnode *b)
}
二叉樹的寬度:具有結點數最多的那一層的結點個數。
採用分層遍歷的方法求出所有結點的層編號,然後,求出各層的結點總數,通過比較找出層結點數最多的值。對應的演算法如下:
問題三:二叉樹b的葉子結點個數//求二叉樹b的寬度
int btwidth(btnode *b)qu[maxsize]; //定義順序非迴圈佇列
int front,rear;
int lnum,max,i,n;
front=rear=0; //置隊列為空
if (b!=null)
if (b->rchild!=null) //右孩子入隊
}max=0; lnum=1; i=1;
while (i<=rear)
lnum=qu[i].lno;
if(n>max) max=n;
} return max;
} else
return 0;
}
當b為空樹時,葉子結點數為0;
當b的左子樹和右子樹都為空,b只有乙個結點時,葉子結點數為1;
當b的左子樹或右子樹不為空時,葉子結點數=左子樹葉子結點數+右子樹葉子結點數。
即遞迴模型為:
f(b)=0, & \text \\ f(b)=1, & \text \\ f(b)=f(b->lchild)+f(b->rchild), & \text \end
⎩⎪⎨⎪⎧
f(b)
=0,f
(b)=
1,f(
b)=f
(b−>lc
hild
)+f(
b−>rc
hild
),若
b=null
若b->lchild==null
且b->rchild==null
其他情況
對應的遞迴演算法如下:
完整**如下://求二叉樹b的葉子結點個數
int leafnodes(btnode *b)
}
效果如下:#include #include #define maxsize 100
typedef char elemtype;
typedef struct nodebtnode;
//由str串建立二叉鏈
void createbtnode(btnode *&b,char *str)
}} j++;
ch=str[j]; }}
//返回data域為x的結點指標
btnode *findnode(btnode *b,elemtype x)
}btnode *lchildnode(btnode *p)
btnode *rchildnode(btnode *p)
//求二叉樹b的深度
int btnodedepth(btnode *b)
}//用括號表示法輸出二叉樹
void dispbtnode(btnode *b) }}
void printbtn(btnode *b,int w)
}//求二叉樹b的寬度
int btwidth(btnode *b)qu[maxsize]; //定義順序非迴圈佇列
int front,rear;
int lnum,max,i,n;
front=rear=0; //置隊列為空
if (b!=null)
if (b->rchild!=null) //右孩子入隊
}max=0; lnum=1; i=1;
while (i<=rear)
lnum=qu[i].lno;
if(n>max) max=n;
} return max;
} else
return 0;
}//求二叉樹b的結點個數
int nodes(btnode *b)
}//求二叉樹b的葉子結點個數
int leafnodes(btnode *b)
}//主函式.cpp
#include "binarytreebase.h"
#include #include void main()
圖(1) 用括號表示法,建立二叉樹,並求它的深度、寬度和葉子結點數
圖(1) 用括號表示法,建立二叉樹,並求它的深度、寬度和葉子結點數
求二叉樹的深度和寬度
求二叉樹的深度和寬度.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std struct btnode 先序建立二叉樹 void creatbtree btnode root else 求二叉樹的深度 int g...
求二叉樹的深度和寬度
二叉樹的深度 從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。二叉樹的寬度 二叉樹的每一層中都有一定數量的節點,節點數最多的那一層的節點數叫做二叉樹的寬度。假設二叉樹的節點有如下資料結構 struc node 1 求二叉樹的深度 根據剛才對二叉樹深度的說明,...
求二叉樹的葉子節點數目
1.設定乙個輔助計數變數作為葉子數目 2.分別遞迴訪問左右子樹,當結點的左右子樹都為空時,計數變數加1 3.得到計數變數的值即為葉子數目 typedef struct binarynodebinarynode param int leafnum 傳入計數變數的位址,通過指標修改變數的值 leafnu...