二叉樹求深度的遞迴的詳細分析
二叉樹求深度遞迴演算法原始碼
》資料結構:
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,然後我們求他們左右子樹的深度,比較左右子樹深度值,返回較大的那乙個 ...