給你二叉樹的根節點 root 和乙個整數 distance 。
如果二叉樹中兩個 葉 節點之間的 最短路徑長度 小於或者等於 distance ,那它們就可以構成一組 好葉子節點對 。
返回樹中 好葉子節點對的數量 。
示例 1:
輸入:root = [1,2,3,null,4], distance = 3
輸出:1
解釋:樹的葉節點是 3 和 4 ,它們之間的最短路徑的長度是 3 。這是唯一的好葉子節點對。
示例 2:
輸入:root = [1,2,3,4,5,6,7], distance = 3
輸出:2
解釋:好葉子節點對為 [4,5] 和 [6,7] ,最短路徑長度都是 2 。但是葉子節點對 [4,6] 不滿足要求,因為它們之間的最短路徑長度為 4 。
示例 3:
輸入:root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3
輸出:1
解釋:唯一的好葉子節點對是 [2,5] 。
示例 4:
輸入:root = [100], distance = 1
輸出:0
示例 5:
輸入:root = [1,1,1], distance = 2
輸出:1
tree 的節點數在 [1, 2^10] 範圍內。
每個節點的值都在 [1, 100] 之間。
1 <= distance <= 10
這道題主要把握兩點:
判斷當前節點為葉子節點
計算任意兩個葉子節點之間的路徑距離,並計算符合要求路徑的對數
判斷是否是葉子節點很簡單,難點是如何求葉子節點之間的距離?
對於二叉樹,我們可以使用佇列進行廣度優先遍歷,同時每個節點都有對應的唯一的路徑,仿照哈夫曼編碼,對於當前節點到左結點路徑使用0記錄,到右結點路徑使用1記錄,這樣可以做到每條路徑唯一,如果兩個節點(n層)共父親節點,其對應的路徑字首一定有n-1個相等,如果兩個節點間的路徑長度,可以轉化成兩個節點分別到第乙個公共祖父節點的路徑之和,也就是說可以比較路徑編碼來判斷其第乙個公共祖父節點位置。即最後乙個編碼相同的節點即其第乙個公共祖父節點。
如上圖所示:
葉子節點4的路徑」00「,節點5的路徑為」01「,節點6的路徑為」10「
,節點7的路徑為」11「,那麼葉子節點4和5之間的距離可以這麼計算:4的路徑長度+5的路徑長度-2*(4和5節點路徑的字首相同的長度) =》2 + 2 - 2*(1) = 2;括號中的1是00和01的字首有相同的0,程度為1
葉子節點4和6之間的距離:2+2-2*(0)=4,00和10沒有相同的字首。
同理可以計算節點5和6的距離是4,節點6和7之間的距離是2。
最後統計滿足條件的對數即可。
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/typedef treenode t;
class
solution
if(node-
>right!=
nullptr)}
int ans =0;
for(
int i =
0; i <
int(trees.
size()
); i++)if
(d <= distance)
ans++;}
}return ans;}}
;
力扣199場比賽 5473 燈泡開關 IV
房間中有 n 個燈泡,編號從 0 到 n 1 自左向右排成一行。最開始的時候,所有的燈泡都是 關 著的。請你設法使得燈泡的開關狀態和 target 描述的狀態一致,其中 target i 等於 1 第 i 個燈泡是開著的,等於 0 意味著第 i 個燈是關著的。有乙個開關可以用於翻轉燈泡的狀態,翻轉操...
第 199 場力扣周賽題解
5472.重新排列字串 思路 額外開乙個字元陣列儲存以及完成題目要求的移動即可。class solution 5473.燈泡開關 iv 思路 一定是從左到右翻轉的,若當前燈是開著的,判斷它之前翻轉了幾次,若是偶數次,則當前仍需要執行翻轉操作,對於關著的燈也是一樣的。class solution re...
力扣 棒球比賽
你現在是棒球比賽記錄員。給定乙個字串列表,每個字串可以是以下四種型別之一 1.整數 一輪的得分 直接表示您在本輪中獲得的積分數。2.一輪的得分 表示本輪獲得的得分是前兩輪有效回合得分的總和。3.d 一輪的得分 表示本輪獲得的得分是前一輪有效回合得分的兩倍。4.c 乙個操作,這不是乙個回合的分數 表示...