首頁>技術>

題目

給定一個有 N 個結點的二叉樹的根結點 root,樹中的每個結點上都對應有 node.val 枚硬幣,

並且總共有 N 枚硬幣。

在一次移動中,我們可以選擇兩個相鄰的結點,然後將一枚硬幣從其中一個結點移動到另一個結點。

(移動可以是從父結點到子結點,或者從子結點移動到父結點。)。

返回使每個結點上只有一枚硬幣所需的移動次數。

示例 1:輸入:[3,0,0] 輸出:2

解釋:從樹的根結點開始,我們將一枚硬幣移到它的左子結點上,一枚硬幣移到它的右子結點上。

示例 2:輸入:[0,3,0] 輸出:3

解釋:從根結點的左子結點開始,我們將兩枚硬幣移到根結點上 [移動兩次]。

然後,我們把一枚硬幣從根結點移到右子結點上。

示例 3:輸入:[1,0,2] 輸出:2

示例 4:輸入:[1,0,0,null,3] 輸出:4

提示:1<= N <= 100

0 <= node.val <= N

解題思路分析

1、遞迴;時間複雜度O(n),空間複雜度O(log(n))

var res intfunc distributeCoins(root *TreeNode) int {	res = 0	dfs(root)	return res}func dfs(root *TreeNode) int { // 該節點子樹多餘/需要金幣數量	if root == nil {		return 0	}	left := dfs(root.Left)	right := dfs(root.Right)	res = res + abs(left) + abs(right)	return left + right + root.Val - 1}func abs(a int) int {	if a < 0 {		return -a	}	return a}
總結

Medium題目,二叉樹題目,統計每一個節點多餘或者需要金幣的數量,當前節點的金幣數量等於左右節點數量+當前節點數量-1

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 少兒學程式設計系列---使用遞迴畫出希爾伯特曲線