求二叉樹的深度 寬度和葉子結點數

2021-07-05 14:19:25 字數 2838 閱讀 7247

如果用鍊錶來儲存二叉樹,那麼可以將二叉樹定義如下:

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...