以二叉樹為例說明遞迴,並用二叉樹的最大深度為例說明兩種遞迴方式的區別。
1、自底向上的遞迴
(1)這種遞迴方式類似於"二叉樹的後序遍歷"。
(2)在每個遞迴層次上,我們首先對所有子節點遞迴地呼叫函式,然後根據返回值和根節點本身的值得到答案。
(3)「自底向上」 的遞迴函式bottom_up(root)
為如下所示:
return specific value for null node
left_ans =
bottom_up
(root.left)
// call function recursively for left child
right_ans =
bottom_up
(root.right)
// call function recursively for right child
return answers // answer
(4)二叉樹的最大深度:
分析:對於樹的單個節點,以節點自身為根的子樹的最大深度x
是多少?我們知道乙個根節點,以其左子節點為根的最大深度為l
和以其右子節點為根的最大深度為r
,然後選擇它們之間的最大值,再加上1來獲得根節點所在的子樹的最大深度。 那就是x = max(l,r)+ 1。
圖示:(從葉子節點開始,從下往上)
**:
// 自底向上的遞迴
intmaxdepth
(treenode* root)
2、自頂向下的遞迴
(1)「自頂向下」 意味著在每個遞迴層級,我們將首先訪問節點來計算一些值,並在遞迴呼叫函式時將這些值傳遞到子節點。
(2) 「自頂向下」 的解決方案可以被認為是一種前序遍歷。
(3)遞迴函式 top_down(root, params) 的原理是這樣的:
return specific value for null node
update the answer if needed // answer
left_ans =
top_down
(root.left, left_params)
// left_params
right_ans =
top_down
(root.right, right_params)
// right_params
return the answer if needed // answer
(4)二叉樹的最大深度:
分析:我們知道根節點的深度是1
。 對於每個節點,如果我們知道某節點的深度,那我們將知道它子節點的深度。 因此,在呼叫遞迴函式的時候,將節點的深度傳遞為乙個引數,那麼所有的節點都知道它們自身的深度。 而對於葉節點,我們可以通過更新深度從而獲取最終答案。
圖示:(從根節點出發,向下遞迴,每次走到葉子節點的時候更新答案)
**
class
solution
void
maxdepth
(treenode* root,
int depth)
maxdepth
(root-
>left,depth+1)
;maxdepth
(root-
>right,depth+1);}}
3、時間和空間複雜度(路徑總和):給你二叉樹的根節點 root 和乙個表示目標和的整數 targetsum ,判斷該樹中是否存在 根節點到葉子節點 的路徑,這條路徑上所有節點值相加等於目標和 targetsum 。
bool
haspathsum
(treenode* root,
int targetsum)
(1) 時間複雜度
子問題的個數乘以解決乙個子問題所需要的時間。(子問題的個數就是遞迴樹中節點的總數)。
時間複雜度:o(n),其中 n 是樹的節點數。
(2)空間複雜度
空間複雜度主要取決於遞迴時棧空間的開銷,最壞情況下,樹呈現鏈狀,空間複雜度為 o(n)。平均情況下樹的高度與節點數的對數正相關,空間複雜度為 o(logn)。
空間複雜度:o(h),其中 h 是樹的高度。
4、主定理
(1)主定理主要是用分治方法帶來的遞迴表示式的漸近複雜度分析。
(2)描述:規模為n的問題通過分治,得到a個規模為n/b的問題,每次遞迴帶來的額外計算為o(nd),d=logba。
則:t(n) = o(log(n)*nd) ,if a = bd(1)
t(n) = o(nd), if a < bd(2)
t(n) = o(n^logba), if a > bd(3)
例如:
(bst的搜尋):給定二叉搜尋樹(bst)的根節點和乙個值。 你需要在bst中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 null。
// 遞迴
treenode searchbst
(treenode* root,
int val)
(1)時間複雜度
在二叉搜尋中,每次分解後只有乙個子問題 a = 1,其規模為初始問題的一半 b = 2,每次分解花費恆定時間o(1),因此d=0。則根據(1)式得log(n).
時間複雜度:o(h),其中 h 是樹高。平均時間複雜度為o(logn),最壞時間複雜度為 o(n)。
(2)空間複雜度
空間複雜度:o(h),遞迴棧的深度為 h。平均情況下深度為o(logn),最壞情況下深度為o(n)。
演算法的特性及時空複雜度
有限性 完成步驟有限,不能形成無窮迴圈 確定性 演算法的每一步驟都必須有確定含義,無二異性得以實現 輸入 有多個或0個輸入 至少有乙個或者多個輸出 可行性 原則上精確進行,操作可以通過已實現基本運算執行有限次而完成 1.不含有語法錯誤 2.對於幾組資料可以得出滿意的結果 3.程式對於精心挑選的典型。...
演算法時空複雜度分析
目錄 1.時間複雜度 2.空間複雜度 3.常見的演算法複雜度 4.相關典型例題 5.總結 在acm範圍裡,我們只需了解時間複雜度可以大致地通過乙個演算法運算的次數來描述程式執行的效率,常常用大寫字母o來表示。在表示時間複雜度的時候,只保留數量級最大的一項,並忽略係數。對於給定的常數n 若某乙個演算法...
時間複雜度和兩種基礎排序
乙個操作如果和資料量沒有關係,每次都是固定時間內完成的操作,叫做常數操作。它是常數運算元量的指標,常用o表示。計算方法 在常數運算元量的表示式中,只要高階項,不要低階項,也不要係數,剩下的部分如果記為f n 你們時間複雜度為f n o 1 即o f n 評價乙個演算法流程的好壞,最先看的指標是時間複...