寫遞迴的三步驟
「確定遞迴函式的引數和返回值:」確定哪些引數是遞迴的過程中需要處理的,那麼就在遞迴函式裡加上這個引數, 並且還要明確每次遞迴的返回值是什麼進而確定遞迴函式的返回型別。
「確定終止條件:」寫完了遞迴演算法, 執行的時候,經常會遇到棧溢位的錯誤,就是沒寫終止條件或者終止條件寫的不對,作業系統也是用乙個棧的結構來儲存每一層遞迴的資訊,如果遞迴沒有終止,作業系統的記憶體棧必然就會溢位。
「確定單層遞迴的邏輯:」確定每一層遞迴需要處理的資訊。在這裡也就會重複呼叫自己來實現遞迴的過程。
什麼時候才能有返回值
(1)如果需要遍歷整棵樹,遞迴函式就不能有返回值。如果需要遍歷某一條符合條件的路徑,遞迴函式就一定要有返回值,因為遇到符合條件的路徑就要及時返回。
(2)如果遞迴函式有返回值,如何區分要搜尋一條邊還是搜尋整棵樹呢?
搜尋一條邊的寫法:
if
(遞迴函式(root.left)
)return;if
(遞迴函式(root.right)
)return
;//另一種形式
left = 遞迴函式(root.left);if
(left)
return
;right = 遞迴函式(root.right);if
(right)
return
;
搜尋整棵樹的寫法:
left = 遞迴函式(root.left)
;right = 遞迴函式(root.right)
;left與right的邏輯處理
在遞迴函式有返回值的情況下:如果要搜尋一條邊,遞迴函式返回值不為空的時候,立刻返回;如果要搜尋整棵樹,直接用乙個變數left、變數right接住返回值,這個left、right後續還有邏輯處理的需要,也就是後序遍歷中處理中間結點的邏輯(也是回溯)。
對於一般的二叉樹,遞迴過程中還有回溯的過程,例如走乙個左方向的分支走到頭了,那麼還要掉頭,再走右分支。但對於二叉搜尋樹,不需要回溯的過程,因為結點的有序性就幫我們確定了搜尋的方向
二叉樹相關題
1 有父指標。分兩種情況 node findnextnode node node 2 右子樹為空,順著父指標往上找,直到找到乙個節點是其父節點的左孩子,則這個父節點就是下乙個節點 else next parent return next 2 普通二叉樹,借助中序遍歷 查詢中序遍歷的某個節點的下乙個節...
二叉樹相關知識
先宣告一下,二叉樹我種了好久都沒有種出來,這只是他的一點兒相關知識而已 前序首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。例如,下圖所示二叉樹的遍歷結果是 abdecf 中序 中序遍歷左子樹。2 訪問根結點。...
樹和二叉樹的相關知識
如果n 0,則他是空樹。如果n 0,則其中存在唯一結點作為樹的根結點 root 除根結點外的其餘元素被分為m m 0 個互不相交的集合t1,t2 tm,每個子集本身也是一棵樹,被稱作根結點的子樹。祖先結點 指按照路徑找到該結點所經過的結點,例如 a,b,d結點是i的祖先結點。子孫結點 祖先結點反過來...