LeetCode演算法題-Quad Tree Intersection(Java實現)
這是悅樂書的第260 次更新,第273 篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第127題(順位題號是558)。四叉樹是樹資料,其中每個內部節點恰好有四個子節點:topLeft,topRight,bottomLeft和bottomRight。四叉樹通常用於通過遞迴地將二維空間細分為四個象限或區域來劃分二維空間。
我們想在我們的四叉樹中儲存true/false。四叉樹用於表示N * N布林網格。對於每個節點,它將被細分為四個子節點,直到它所代表的區域中的值全部相同。每個節點都有另外兩個布林屬性:isLeaf和val。當且僅當節點是葉節點時,isLeaf才為真。葉節點的val屬性包含它所代表的區域的值。
例如,下面是兩個四叉樹A和B:
A: +-------+-------+T: true |||F: false |T|T| ||| +-------+-------+ ||| |F|F| ||| +-------+-------+ topLeft: T topRight: T bottomLeft: F bottomRight: F B: +-------+---+---+ || F | F | |T+---+---+ || T | T | +-------+---+---+ ||| |T|F| ||| +-------+-------+ topLeft: T topRight: topLeft: F topRight: F bottomLeft: T bottomRight: T bottomLeft: T bottomRight: F
您的任務是實現一個將需要兩個四叉樹並返回表示兩棵樹的邏輯OR(或並集)的四叉樹的函式。
A:B:C (A or B): +-------+-------++-------+---+---++-------+-------+ ||||| F | F |||| |T|T||T+---+---+|T|T| ||||| T | T |||| +-------+-------++-------+---+---++-------+-------+ ||||||||| |F|F||T|F||T|F| ||||||||| +-------+-------++-------+-------++-------+-------+
注意:
-
A和B都表示大小為N * N的網格。
-
N保證是2的冪。
-
如果您想了解有關四叉樹的更多資訊,可以參考其維基。
-
邏輯OR運算定義如下:如果A為true,或者如果B為true,或者如果A和B都為true,則“A或B”為true。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 解題
題目描述了一種新的資料結構,四叉樹,要求計算出兩個四叉樹的並集,以一個新的四叉樹作為結果返回。
一個四叉樹含多個內部節點,每個內部節點擁有四個子節點,每個節點擁有兩個屬性isLeaf和val,只有四個子節點都是葉子節點時,該節點本身的isLeaf屬性才會為true,只有四個子節點的值都相同(都為true或false)時,該節點本身的val屬性才會為true或false,與其四個子節點的val值等同。
我們直接使用遞迴,如果quadTree1活著quadTree2是葉子節點,並且其val屬性為true,直接返回quadTree1或quadTree2。如果都不是葉子節點,那麼就對其四個子節點作為引數,呼叫自身,進行二次操作,返回的節點組成新的節點的子節點,接著計算新節點的兩個屬性isLeaf和val,最後返回該新節點即可。在本題中,我們直接使用quadTree1作為新的節點,當然,你也可以建立一個新的Node物件來承接。
public Node intersect(Node quadTree1, Node quadTree2) { if (quadTree1.isLeaf) { return quadTree1.val ? quadTree1 : quadTree2; } if (quadTree2.isLeaf) { return quadTree2.val ? quadTree2 : quadTree1; } quadTree1.topLeft = intersect(quadTree1.topLeft, quadTree2.topLeft); quadTree1.topRight = intersect(quadTree1.topRight, quadTree2.topRight); quadTree1.bottomLeft = intersect(quadTree1.bottomLeft, quadTree2.bottomLeft); quadTree1.bottomRight = intersect(quadTree1.bottomRight, quadTree2.bottomRight); if (quadTree1.topLeft.isLeaf && quadTree1.topRight.isLeaf && quadTree1.bottomLeft.isLeaf && quadTree1.bottomRight.isLeaf && quadTree1.topLeft.val == quadTree1.topRight.val && quadTree1.topRight.val == quadTree1.bottomLeft.val && quadTree1.bottomLeft.val == quadTree1.bottomRight.val) { quadTree1.isLeaf = true; quadTree1.val = quadTree1.topLeft.val; } return quadTree1; }
03 小結
演算法專題目前已日更超過三個月 ,演算法題文章127 +篇,公眾號對話方塊回覆【資料結構與演算法 】、【演算法 】、【資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!