LeetCode算法題-Quad Tree Intersection(Java實(shí)現(xiàn))

這是悅樂書的第260次更新,第273篇原創(chuàng)

01 看題和準(zhǔn)備

今天介紹的是LeetCode算法題中Easy級(jí)別的第127題(順位題號(hào)是558)整陌。四叉樹是樹數(shù)據(jù),其中每個(gè)內(nèi)部節(jié)點(diǎn)恰好有四個(gè)子節(jié)點(diǎn):topLeft,topRight她奥,bottomLeft和bottomRight瓮增。四叉樹通常用于通過遞歸地將二維空間細(xì)分為四個(gè)象限或區(qū)域來劃分二維空間。

我們想在我們的四叉樹中存儲(chǔ)true/false哩俭。四叉樹用于表示N * N布爾網(wǎng)格绷跑。對(duì)于每個(gè)節(jié)點(diǎn),它將被細(xì)分為四個(gè)子節(jié)點(diǎn)凡资,直到它所代表的區(qū)域中的值全部相同砸捏。每個(gè)節(jié)點(diǎn)都有另外兩個(gè)布爾屬性:isLeaf和val。當(dāng)且僅當(dāng)節(jié)點(diǎn)是葉節(jié)點(diǎn)時(shí)隙赁,isLeaf才為真带膜。葉節(jié)點(diǎn)的val屬性包含它所代表的區(qū)域的值。

例如鸳谜,下面是兩個(gè)四叉樹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

您的任務(wù)是實(shí)現(xiàn)一個(gè)將需要兩個(gè)四叉樹并返回表示兩棵樹的邏輯OR(或并集)的四叉樹的函數(shù)膝藕。

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的網(wǎng)格。

  • N保證是2的冪咐扭。

  • 如果您想了解有關(guān)四叉樹的更多信息芭挽,可以參考其維基。

  • 邏輯OR運(yùn)算定義如下:如果A為true蝗肪,或者如果B為true袜爪,或者如果A和B都為true,則“A或B”為true薛闪。

本次解題使用的開發(fā)工具是eclipse辛馆,jdk使用的版本是1.8,環(huán)境是win7 64位系統(tǒng)豁延,使用Java語言編寫和測(cè)試昙篙。

02 解題

題目描述了一種新的數(shù)據(jù)結(jié)構(gòu),四叉樹诱咏,要求計(jì)算出兩個(gè)四叉樹的并集苔可,以一個(gè)新的四叉樹作為結(jié)果返回。

一個(gè)四叉樹含多個(gè)內(nèi)部節(jié)點(diǎn)袋狞,每個(gè)內(nèi)部節(jié)點(diǎn)擁有四個(gè)子節(jié)點(diǎn)焚辅,每個(gè)節(jié)點(diǎn)擁有兩個(gè)屬性isLeaf和val,只有四個(gè)子節(jié)點(diǎn)都是葉子節(jié)點(diǎn)時(shí)苟鸯,該節(jié)點(diǎn)本身的isLeaf屬性才會(huì)為true同蜻,只有四個(gè)子節(jié)點(diǎn)的值都相同(都為true或false)時(shí),該節(jié)點(diǎn)本身的val屬性才會(huì)為true或false早处,與其四個(gè)子節(jié)點(diǎn)的val值等同湾蔓。

我們直接使用遞歸,如果quadTree1活著quadTree2是葉子節(jié)點(diǎn)陕赃,并且其val屬性為true卵蛉,直接返回quadTree1或quadTree2颁股。如果都不是葉子節(jié)點(diǎn),那么就對(duì)其四個(gè)子節(jié)點(diǎn)作為參數(shù)傻丝,調(diào)用自身甘有,進(jìn)行二次操作,返回的節(jié)點(diǎn)組成新的節(jié)點(diǎn)的子節(jié)點(diǎn)葡缰,接著計(jì)算新節(jié)點(diǎn)的兩個(gè)屬性isLeaf和val亏掀,最后返回該新節(jié)點(diǎn)即可。在本題中泛释,我們直接使用quadTree1作為新的節(jié)點(diǎn)滤愕,當(dāng)然,你也可以創(chuàng)建一個(gè)新的Node對(duì)象來承接怜校。

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 小結(jié)

算法專題目前已日更超過三個(gè)月间影,算法題文章127+篇,公眾號(hào)對(duì)話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】茄茁、【算法】魂贬、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集裙顽。

以上就是全部?jī)?nèi)容付燥,如果大家有什么好的解法思路、建議或者其他問題愈犹,可以下方留言交流键科,點(diǎn)贊、留言漩怎、轉(zhuǎn)發(fā)就是對(duì)我最大的回報(bào)和支持勋颖!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扬卷,隨后出現(xiàn)的幾起案子牙言,更是在濱河造成了極大的恐慌,老刑警劉巖怪得,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卑硫,居然都是意外死亡徒恋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門欢伏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來入挣,“玉大人,你說我怎么就攤上這事硝拧【斗ぃ” “怎么了葛假?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)滋恬。 經(jīng)常有香客問我聊训,道長(zhǎng),這世上最難降的妖魔是什么恢氯? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任带斑,我火速辦了婚禮,結(jié)果婚禮上勋拟,老公的妹妹穿的比我還像新娘勋磕。我一直安慰自己,他們只是感情好敢靡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布挂滓。 她就那樣靜靜地躺著,像睡著了一般啸胧。 火紅的嫁衣襯著肌膚如雪赶站。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天吓揪,我揣著相機(jī)與錄音亲怠,去河邊找鬼。 笑死柠辞,一個(gè)胖子當(dāng)著我的面吹牛团秽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叭首,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼习勤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了焙格?” 一聲冷哼從身側(cè)響起图毕,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眷唉,沒想到半個(gè)月后予颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冬阳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蛤虐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝陪。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驳庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饲常,我是刑警寧澤蹲堂,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站贝淤,受9級(jí)特大地震影響柒竞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹娄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一能犯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬耻,春花似錦踩晶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至计济,卻和暖如春茸苇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沦寂。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工学密, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人传藏。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓腻暮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親毯侦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哭靖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容