如果用鍊錶來儲存二叉樹,那麼可以將二叉樹定義如下:
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的寬度
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的葉子結點個數
當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...