題目描述:
給定一棵有 n 個結點的二叉樹,你的任務是檢查是否可以通過去掉樹上的一條邊將樹分成兩棵,且這兩棵樹結點之和相等。
樣例 1:
輸入:輸出: true
解釋:和: 15
和: 15
樣例 2:
輸入:輸出: false
解釋: 無法通過移除一條樹邊將這棵樹劃分成結點之和相等的兩棵子樹。
注釋 :
樹上結點的權值範圍 [-100000, 100000]。
1 <= n <= 10000
方法1:
主要思路:
(1)先計算出各個結點作為根節點的時,對應的子樹的和,並統計出原來樹的所有結點的總和;
(2)判斷原來樹的所有結點的總和是否為奇數,若為奇數,則直接返回false;
(3)比較易混的是原來樹的所有結點的總和為0時的情形,此時需要判斷為0時,則需要出現大於一次才行,不為0時,則原來所有結點的總和的一半需要出現過才行;
(4)否則,返回false;
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
int left_sum=
helper
(root-
>left,mp)
;int right_sum=
helper
(root-
>right,mp)
;int cur_sum=left_sum+right_sum+root-
>val;
++mp[cur_sum]
;return cur_sum;
}bool
checkequaltree
(treenode* root)
//判斷總和是否是0,若是0,則需要0的出現次數大於1(因為0除以2還是0)
if(sum_all==
0&&mp[sum_all]
>1)
//若不是0,則需要總和的一半出現過
if(sum_all!=
0&&mp.
count
(sum_all/2)
)//否則,返回false
return
false;}
};
leetcode 663 均勻樹劃分
給定一棵有 n 個結點的二叉樹,你的任務是檢查是否可以通過去掉樹上的一條邊將樹分成兩棵,且這兩棵樹結點之和相等。樹型dp,dp i 代表i節點和它子樹節點的總和,那麼,我們先求出dp root 然後再判斷是否存在某乙個點,它的dp i sum dp i 如果有就返回true,否則返回false。de...
劃分樹小結
最近學習了一下劃分樹,下面總結一下。我們在求區間最值的時候,一般可以用線段樹解決,但是如果要求區間第k小或者第k大值的話線段樹就有點力不從心了,這是我們可以用劃分樹來解決。劃分樹利用了快速排序的思想,首先是建樹,我們設當前區間的中位數為mid,為了能快速找到區間的中位數,我們一般先對原序列做一次排序...
劃分樹詳解
題目 給出n個數,和m個區間 對於每個區間 l r 輸出這個區間裡面第k大的數。我們來看看劃分樹是怎麼構造的。構造 以2104為例子,舉2 0 6 8 5 1 4 3 9為例子,構造劃分樹是這樣的 上面的內容是用乙個二位陣列val儲存下來的,第一維表示劃分樹的第幾層,第二位表示在這一層中的位置。要注...