二叉樹深度求解(遞迴,非遞迴)

2021-07-11 16:41:35 字數 828 閱讀 5802

遞迴實現基本思想:

為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞迴返回的條件是若節點為空,返回0

演算法:

1

intfindtreedeep(bintree bt)

8return

deep;

9 }

非遞迴實現基本思想:

受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求二叉樹的深度,在每一次輸出的地方替換成算棧s的大小,遍歷結束後最大的棧s長度即是棧的深度。

演算法的執行步驟如下:

(1)當樹非空時,將指標p指向根節點,p為當前節點指標。

(2)將p壓入棧s中,0壓入棧tag中,並令p執行其左孩子。

(3)重複步驟(2),直到p為空。

(4)如果tag棧中的棧頂元素為1,跳至步驟(6)。從右子樹返回

(5)如果tag棧中的棧頂元素為0,跳至步驟(7)。從左子樹返回

(6)比較treedeep與棧的深度,取較大的賦給treedeep,對棧s和棧tag出棧操作,p指向null,並跳至步驟(8)。

(7)將p指向棧s棧頂元素的右孩子,彈出棧tag,並把1壓入棧tag。(另外一種方法,直接修改棧tag棧頂的值為1也可以)

(8)迴圈(2)~(7),直到棧為空並且p為空

(9)返回treedeep,結束遍歷

1

inttreedeep(bintree bt )

12if(top(tag)==1

)else23}

24return

deeptree;

25 }

好文要頂

關注我收藏該文

求解二叉樹的高度(遞迴 非遞迴)

遞迴方式 遞迴方式的求解過程很簡單,只需要將問題分解。首先,遞迴出口是什麼?毫無疑問,當樹節點為空時,我們就可以結束遞迴了。那麼當前樹的高度和其左子樹及右子樹的關係是什麼呢?樹的高度,定義為從根節點到葉子節點的最長路徑 因此當前樹深應該是自身節點所佔的一層高度加上左右子樹中深的高度。因此,有一下遞迴...

二叉樹 遞迴 非遞迴

include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...

遞迴與非遞迴求二叉樹深度

分別用遞迴與非遞迴演算法求二叉樹深度。方法一 遞迴方法大家都很熟悉,如何用非遞迴求解呢?我們知道二叉樹有層序遍歷,利用層序遍歷的過程,記錄當前層數,那麼遍歷結束後也就求得二叉樹的層數,即深度。方法二 層序遍歷需要使用乙個佇列來儲存樹的節點。初始化講根節點入隊。接著只要佇列不為空,則出隊,並將出隊元素...