題目介紹
描述:
最大樹定義:一個樹,其中每個節點的值都大於其子樹中的任何其他值。
給出最大樹的根節點 root。
就像之前的問題那樣,給定的樹是從表 A(root = Construct(A))遞歸地使用下述 Construct(A) 例程構造的:
如果 A 爲空,返回 null 否則,令 A[i] 作爲 A 的最大元素。創建一個值爲 A[i] 的根節點 root root 的左子樹將被構建爲 Construct([A[0], A[1], ..., A[i-1]]) root 的右子樹將被構建爲 Construct([A[i+1], A[i+2], ..., A[A.length - 1]]) 返回 root 請注意,我們沒有直接給定 A,只有一個根節點 root = Construct(A).
假設 B 是 A 的副本,並附加值 val。保證 B 中的值是不同的。
返回 Construct(B)。
解題思路:
遞歸算法的關鍵是要明確函數的「定義」是什麼,然後相信這個定義,利用這個定義推導最終結果。
寫樹相關的算法,簡單說就是,先搞清楚當前 root 節點該做什麼,然後根據函數定義遞歸調用子節點,遞歸調用會讓孩子節點做相同的事情。
二叉樹題目的一個難點在於如何通過題目的要求思考出每一個節點需要做什麼
二叉樹解題策略
一 遞歸 二 隊列 + 迭代 (層次遍歷) 三 棧 + 迭代 (非遞歸遍歷) 四 其它
三種基本的遍歷方式,都可以用遞歸來實現。寫遞歸算法的時候,需要注意遞歸退出條件以及遞歸操作的表達。
自己的解法實現
無論如何自己先實現一下…
網上比較優秀的解法
解法一
分三種情況考慮:
val > root.val,直接把root掛在val節點的left上 val < root.val, val應該在root的右子樹中,但具體在哪不知道,所以遞歸調用繼續往下找 root == None, val在root中最小時的終結情況,作爲最右葉子節點掛在root中
def insertIntoMaxTree(self, root, val):
if not root:return TreeNode(val)
if root.val > val:
root.right = self.insertIntoMaxTree(root.right, val)
return root
if root.val < val:
return TreeNode(val, root)
解法二
解法三 …
相關知識總結和思考
相關知識:
BFS:廣度/寬度優先。其實就是從上到下,先把每一層遍歷完之後再遍歷一下一層。
可以使用Queue的數據結構。我們將root節點初始化進隊列,通過消耗尾部,插入頭部的方式來完成BFS。
二叉搜索樹(BST)的特性:
- 若它的左子樹不爲空,則所有左子樹上的值均小於其根節點的值
- 若它的右子樹不爲空,則所有右子樹上的值均大於其根節點的值
- 它的左右子樹也分別爲二叉搜索樹
遞歸與迭代的區別
遞歸:重複調用函數自身實現循環稱爲遞歸; 迭代:利用變量的原值推出新值稱爲迭代,或者說迭代是函數內某段代碼實現循環;