1.遞迴的本質是通過棧來儲存狀態,然後再次呼叫自己進入新的狀態,函式返回的時候回到上次儲存的狀態。
所以遞迴轉化為非遞迴,一般通用方法是通過棧儲存當前結果狀態。
2.舉個例子:
二叉樹最大深度(遞迴版)
1public
static
intdeep(tree tree)89
if(tree.getleft() == null && tree.getright() == null
) 14
15int ltree =deep(tree.getleft());//遍歷左子樹深度
17int rtree =deep(tree.getright());//遍歷有子樹深度
1819
return ltree > rtree ? ltree+1:rtree+1;//比較左右子樹深度,返回打的一邊
2021 }
二叉樹最大深度(非遞迴版)
1public
static
intdeep2(tree tree)
5int max = 0;
6 stackstacks = new stack();//節點棧
7 stackheights = new stack();//儲存當前節點深度狀態
8 heights.push(1);
9stacks.push(tree);
10while (!stacks.isempty())
1819
if(curtree.getright() != null)23
if(max 29return
max;
30 }
3.總結.
遞迴容易造成棧溢位,通過非遞迴版實現,更節省空間。
遞迴演算法簡單,一般很難理解,非遞迴版**量多,但易理解。面試時要你寫個遞迴版的實現,不妨可以試試非遞迴版實現。
二叉樹最小深度(遞迴版)
題目 給定乙個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明 葉子節點是指沒有子節點的節點。示例 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回它的最小深度 2.分析 我最初的思路是遞迴所有節點,節點不為null則加1,然後r...
遞迴與非遞迴求二叉樹深度
分別用遞迴與非遞迴演算法求二叉樹深度。方法一 遞迴方法大家都很熟悉,如何用非遞迴求解呢?我們知道二叉樹有層序遍歷,利用層序遍歷的過程,記錄當前層數,那麼遍歷結束後也就求得二叉樹的層數,即深度。方法二 層序遍歷需要使用乙個佇列來儲存樹的節點。初始化講根節點入隊。接著只要佇列不為空,則出隊,並將出隊元素...
求二叉樹的最大深度(遞迴 非遞迴)
力扣104也有該題,可以使用上面進行驗證。當節點為空時,返回0。不為空時,當前節點為根節點的子樹深度為 左子樹深度 右子樹深度 1。求二叉樹的最大深度 param root return public int maxdepth treenode root return math.max maxdep...