演算法題解 用DFS(遞迴)尋找樹中的最大權值路徑

2021-09-14 08:32:54 字數 1152 閱讀 9542

不難分析出,最大的路徑是「^型」的,從乙個最高點向下延伸的兩條路徑組成乙個「^型」路徑。注意這個「最高點」不一定是樹的根。

並且,這兩條路徑必定分別經過左右子節點,並且是向下路徑中權值最大的。

由於每個節點都有可能是「最高點」,因此對於每個節點(可以用dfs/bfs遍歷每個節點),我們都要計算出以該節點為「最高點」的最大「^型」路徑;。為了計算出該值,我們要先得到經過左子節點的最長向下路徑經過右子節點的最長向下路徑(這兩個值可以用dfs得到),兩者相加,再加上該節點本身的權值,就得到了以該節點為「最高點」的最大「^型」路徑;

這時如果不注意可能會出現嚴重的效能問題:兩層dfs巢狀。第一層dfs用於遍歷每個節點,並假設這個節點為「^型」路徑的最高點;對於每個節點,又會進行第二層dfs:用於計算兩個最長的向下路徑。

兩層dfs巢狀會大大影響計算時間,我們應該合併兩次dfs。注意到dfs只不過是一種特殊的遞迴呼叫,對於父節點的每個子節點,都進行一次遞迴呼叫,每個子節點都遍歷完畢(子節點的呼叫堆疊經歷裝載、彈出)以後,返回到父節點的呼叫堆疊(如果父節點不需要進行後續的計算,則父節點的呼叫堆疊彈出)。我們如果在第一次遍歷中就計算出經過子節點的最長的向下路徑,並返回給父節點的呼叫堆疊,父節點就能直接計算出經過左/右子節點的最長的向下路徑,從而避免第二層的遞迴呼叫。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

// 計算從subroot向下的最大路徑權值

// 如果經過subroot的路徑都為負值,則返回0(終止於subroot的路徑權值)

int calculatemaxpathdown(treenode *subroot)

};

由於對每個節點僅僅進行一次遞迴呼叫,因此時間複雜度為o(n)

由此可見,在選擇遞迴之前,我們應該仔細思考每次遞迴呼叫應該計算什麼、返回什麼。

尋找二叉樹中每個結點的根結點(遞迴演算法)

筆者查閱了網上關於二叉樹尋找根結點的演算法,眾說紛紜,有 在節點結構體中加一條指向父節點的指標 非遞迴遍歷樹的方式尋找父節點 直接利用樹的遞迴遍歷,列印輸出父節點 筆者認為新增父節點指標的方法,不能很好地體現樹的邏輯結構。樹的結構體 特指二叉樹的儲存結構 已經很成熟而且近乎約定俗成了,再重新新增乙個...

遞迴演算法及DFS搜尋的應用

遞迴演算法,說白了就是程式呼叫自身的程式設計技巧的一種演算法。它能更好的實現一種反覆執行的過程 呼叫自身的方式 能讓一些反覆迴圈的問題變得簡單化,使之更好的讓計算機運算出結果。遞迴需滿足2個條件 1 有反覆執行的過程 呼叫自身 2 有跳出反覆執行過程的條件 遞迴出口 一般來說,遞迴需要有邊界條件 遞...

演算法題解 遞迴 母牛的數量

description有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?input輸入資料由多個測試例項組成,每個測試例項佔一行,包括乙個整數n 0output對於每個測試例項,輸出在第n年的時候母牛的數量。每個輸出...