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

2021-07-22 02:54:07 字數 2051 閱讀 6198

分別用遞迴與非遞迴演算法求二叉樹深度。

方法一:

遞迴方法大家都很熟悉,如何用非遞迴求解呢?

我們知道二叉樹有層序遍歷,利用層序遍歷的過程,記錄當前層數,那麼遍歷結束後也就求得二叉樹的層數,即深度。

方法二:

層序遍歷需要使用乙個佇列來儲存樹的節點。初始化講根節點入隊。接著只要佇列不為空,則出隊,並將出隊元素的子節點入隊。

當需要記錄樹的深度時,可以使用兩個佇列,第乙個佇列儲存當前訪問的那一層的節點,講當前這一層的節點的子節點壓入下一佇列,這樣需要兩個佇列的額外空間。

若只使用乙個佇列,則需要乙個特殊的標記mark。當我們把某一層的節點入隊之後,再壓入乙個標記mark。當我們在出對是遇到乙個標記mark時,我們就知道已經訪問完了一層,則當前佇列中的元素全部是下一層的節點,我們再壓入乙個標記mark。用標記mark來標記層數,可以減少乙個佇列的使用,但是前提是儲存佇列的資料結構能找到特殊的mark元素。

方法三:利用後序遍歷的思想

受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求二叉樹的深度,在每一次輸出的地方替換成算棧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,結束遍歷

/*

* 題目:二叉樹和為某一值的路徑

* 描述:輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。

* 路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

*/#include #include #include #include #include using namespace std;

const int flag = int_min;

struct treenode

};/*遞迴求二叉樹高度*/

int depth(treenode *root)

/*非遞迴求二叉樹高度 -- 採用層序遍歷的思想,記錄樹的層數*/

int depth2(treenode *root)

//while

++d;

nodes = q;

}//while

return d;

}//非遞迴求二叉樹高度 -- 利用後序遍歷思想

int depth3(treenode *root)

//while

if (tag.top() == 1)

else //else

}//while

return d;

}treenode *generatetree(vector&nums)

//定義非空右子樹

if (i + 1 < size && nums[i + 1] != flag)

tmp->left = left;

tmp->right = right;

//彈出當前處理的節點

que.pop();

} return root;

}int main()

; treenode *root = generatetree(v);

cout << depth(root) << endl;

cout << depth2(root) << endl;

cout << depth3(root) << endl;

system("pause");

return 0;

}

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

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

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

遞迴實現基本思想 為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞迴返回的條件是若節點為空,返回0 演算法 1 intfindtreedeep bintree bt 8return deep 9 非遞迴實現基本思想 受後續遍歷二叉樹思想的啟發,想到可以利用後續遍歷的方法來求...

二叉樹 遞迴 非遞迴

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