二叉樹求深度的遞迴的詳細分析

2021-05-25 13:01:57 字數 2133 閱讀 1732

二叉樹求深度的遞迴的詳細分析

二叉樹求深度遞迴演算法原始碼

》資料結構:

typedef struct binode

binode,*bittree;

》遞迴函式

int gettreedeep(bittree t)//

計算二叉樹的深度 }

(a)圖,假設給出建立了這個二叉樹,使用如上給出的遞迴實現的經典演算法,這個遞迴過程是怎樣的呢?

遞迴過程中

gettreedeep

這個函式被自身多次呼叫,讓我們給它們標號:

函式返回值

做什麼?

步驟gettreedeep

----

》進入函式

----

》訪問a0

int a = gettreedeep(t->lchild);1

----

》訪問b

1int a = gettreedeep(t->lchild);0----

》訪問b

的左空節點2

int b = gettreedeep(t->rchild);0----

》訪問b

的右空節點3

此時標號

2,3函式完成,得到

a=0,由步驟

2,3得到步驟

1函式的a值為

1,再由步驟

1得到步驟

0對應的返回值為

2,此時計算到樹的高度為

2,這只是根節點左部的子樹高度,此時執行到剛開始進入函式內的第二個

gettreedeep

,所以接下來該訪問右部子樹:

int b = gettreedeep(t->rchild);

------

》訪問c4

int a = gettreedeep(t->lchild);

2------

》訪問d5

int a = gettreedeep(t->lchild);

1------

》訪問f6

int a = gettreedeep(t->lchild);

0------

》訪問f

的左空節點7

int b = gettreedeep(t->rchild);0

------

》訪問f

的右空節點8

步驟7,8

的返回值為

0,由此得到步驟

6的返回值為

1,步驟

4對應的返回值為

2,接下來,執行到該訪問

c的右節點:

int b = gettreedeep(t->rchild);------

》訪問e9

int a = gettreedeep(t->lchild);1------

》訪問g10

int a = gettreedeep(t->lchild);0------

》訪問g

的左空節點11

int b = gettreedeep(t->rchild);0------

》訪問g

的右空節點12

以此類推:可知步驟

8的返回值為

1,現在該訪問

e的右節點:

int b = gettreedeep(t->rchild);1------

》訪問h13

int a = gettreedeep(t->lchild);0------

》訪問h

的左空節點14

int b = gettreedeep(t->rchild);0------

》訪問h

的右空節點15

現在開始返回,比較各個節點的返回值孰大孰小

1,首先比較的是步驟

13和步驟

10的返回值,二者一樣大,返回

1+1,步驟

9得返回值2

2,比較步驟9和

5,二者同樣為

2,故步驟

4的返回值為

2+1,為3

3,比較步驟

4和步驟

1,前者為

3,後者為

1,取前者,所以最後返回

3+1,得步驟

0的返回值為

4,,即為最終結果。

二叉樹建立和遍歷詳細分析

對於二叉樹,原來始終不明白用遞迴前序建立,前序遍歷究竟是怎麼回事,今天晚上好好琢磨了下。兩種不同的方法 1 可以考慮把遞迴呼叫的函式考慮為呼叫不同的函式,方便分析。2,如果考慮為呼叫同乙個函式時,遞迴是用棧來實現的,用棧來分析的話就比較方便。對於如圖所示的乙個二叉樹,前序建立時的 為 brief 遞...

求二叉樹的最大深度(遞迴 非遞迴)

力扣104也有該題,可以使用上面進行驗證。當節點為空時,返回0。不為空時,當前節點為根節點的子樹深度為 左子樹深度 右子樹深度 1。求二叉樹的最大深度 param root return public int maxdepth treenode root return math.max maxdep...

求二叉樹的深度

題目 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉子結點一次經過的結點形成樹的一條路徑,最長路徑的長度為樹的深度。根節點的深度為1。解體思路 如果根節點為空,則深度為0,返回0,遞迴的出口 如果根節點不為空,那麼深度至少為1,然後我們求他們左右子樹的深度,比較左右子樹深度值,返回較大的那乙個 ...