663 均勻樹劃分

2021-10-24 14:54:43 字數 1290 閱讀 6250

題目描述:

給定一棵有 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儲存下來的,第一維表示劃分樹的第幾層,第二位表示在這一層中的位置。要注...