二叉樹演算法趣題

2021-07-27 09:13:55 字數 1542 閱讀 6788

二叉樹中的節點x含有乙個變數wealth表徵了該節點的財富,定義二叉樹中節點x的heritage為其祖先節點(包括x)的所有wealth之和減去節點x的子孫節點的所有wealth之和。求二叉樹中heritage最大的節點及其值。【要求不能改變原有二叉樹的結構,不能在節點之上儲存別的資訊,演算法複雜度盡量簡單】

看到這個題目,最簡單的思路就是二叉樹的遍歷。第一種思路是進行兩次遍歷,第一次遍歷是全域性遍歷,第二次遍歷是尋找祖先節點和子孫節點並計算其差。很明顯,演算法複雜度是o(n^2)。

很明顯這樣的複雜度過高。如何進行一次遍歷來求得解呢?可以考慮一般的情況,我們考慮節點x為根的子樹,以及x的左孩子x.left和x的右孩子x.right。當我們獲知x.left或者x.right中具有最大的heritage的節點後,很明顯,以節點x為根的子樹中,具有最大heritage的節點只可能有三種情況:

一是節點x本身,二是x.left中具有最大的heritage的節點,三是x.right中具有最大的heritage的節點。

究竟是那種情況呢?

這取決於它們之間heritage的大小。其一是x.wealth - treeworthofleft - treeworthofright,即節點x的heritage。treeworthofleft表示x的所有左子樹wealth之和,treeworthofright表示x所有右子樹wealth之和。其二是maxheritageofleft + x.wealth,即在以x.left為根的子樹中的最大heritage加上x的wealth。其三是maxheritageofright + x.wealth,即在以x.right為根的子樹中的最大heritage加上x的wealth。

如此,通過遞迴後續遍歷,可以解決此問題。

演算法偽**如下:

input: node x

output:p, maxheritage , treeworth

function

findmaxheritage

(x)(pofleft, maxheritageofleft , treeworthofleft) = findmaxheritage

(x.left)

(pofright, maxheritageofright , treeworthofright) = findmaxheritage

(x.right)

treeworth = treeworthofleft + treeworthofright + x.wealth

maxheritage = max

if maxheritage == x.wealth - treeworthofleft - treeworthofright then p=x

if maxheritage == maxheritageofleft + x.wealth then p=pofleft

if maxheritage == maxheritageofright + x.wealth then p=pofright

return (p, maxheritage, treeworth)

至此完。很有啟發意義。

(二叉樹提高題)還原二叉樹

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入格式 輸入首先給出正整數n 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出格式 輸出為乙個整數,即該二叉樹的高度。輸入樣例 9 abdfghiec fdhgi...

每日演算法題 《重建二叉樹》

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。所以我們可以知道,前序遍歷第乙個是中,也就是頭結點 class treenode def init self,x self.val ...

LeetCode演算法題 對稱二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。definition for a binary tree node.pub...