給定乙個有 n 個結點的二叉樹的根結點 root,樹中的每個結點上都對應有 node.val 枚硬幣,並且總共有 n 枚硬幣。在一次移動中,我們可以選擇兩個相鄰的結點,然後將一枚硬幣從其中乙個結點移動到另乙個結點。(移動可以是從父結點到子結點,或者從子結點移動到父結點。)。返回使每個結點上只有一枚硬幣所需的移動次數。
要使得硬幣移動次數最少,我們應該把結點中多餘的硬幣移到離它最近且需要硬幣的結點上。
由於是在二叉樹上移動,則硬幣移動軌跡一定是從某結點移動到他的父節點或者子節點上。
從需要硬幣的結點到有多餘硬幣的結點的距離等於從有多餘硬幣結點的距離到需要硬幣的結點的距離。
乙個結點可能有兩個子節點,因此,如果該結點需要硬幣或者有多餘的硬幣,我們無法一下子確定該硬幣應該從左子節點還是右子節點獲得或者移向左子節點還是右子節點;而乙個結點一定只有乙個父節點,因此,如果該結點需要硬幣或者有多餘的硬幣,移動軌跡一定會經過他的父節點。
採用深度搜尋優先的思路,從樹的葉子節點出發,如果該結點(設為cur)需要硬幣,則從他的父節點獲得,如果該結點有多餘的硬幣,則多餘的硬幣全部移動向他的父節點。即該結點的初始值為cur.val,從該結點遞迴到他的父節點,移動次數增加math.abs(cur.val - 1)。該結點cur.val變為期待的1,如果該結點的值cur.val > 1,則他的父節點的的值cur.parent.val = cur.parent.val + cur.val - 1;如果該結點的值cur.val <= 1,則他的父節點的的值cur.parent.val = cur.parent.val - (-cur.val + 1)。逐步遞迴,直到遍歷完整棵樹,則可得出結果。
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
// 該方法返回值為移動完成後結點cur擁有多餘的或者缺少的硬幣數量,即cur.val - 1。
public
intdfs
(treenode cur)
}
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
// 該方法返回值為移動好當前結點(包括他的子節點,即當前結點表示的樹)需要的移動次數
public
intdfs
(treenode cur, treenode parent)
else
if(cur.val >1)
return result;
}}
979 在二叉樹中分配硬幣
給定乙個有 n 個結點的二叉樹的根結點 root,樹中的每個結點上都對應有 node.val 枚硬幣,並且總共有 n 枚硬幣。在一次移動中,我們可以選擇兩個相鄰的結點,然後將一枚硬幣從其中乙個結點移動到另乙個結點。移動可以是從父結點到子結點,或者從子結點移動到父結點。返回使每個結點上只有一枚硬幣所需...
leetcode 979 在二叉樹中分配硬幣
給定乙個有 n 個結點的二叉樹的根結點 root,樹中的每個結點上都對應有 node.val 枚硬幣,並且總共有 n 枚硬幣。在一次移動中,我們可以選擇兩個相鄰的結點,然後將一枚硬幣從其中乙個結點移動到另乙個結點。移動可以是從父結點到子結點,或者從子結點移動到父結點。返回使每個結點上只有一枚硬幣所需...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...