每日算法題—?jiǎng)h點(diǎn)成林

題目描述

給出二叉樹的根節(jié)點(diǎn) root,樹上每個(gè)節(jié)點(diǎn)都有一個(gè)不同的值。

如果節(jié)點(diǎn)值在 to_delete 中出現(xiàn),我們就把該節(jié)點(diǎn)從樹上刪去,最后得到一個(gè)森林(一些不相交的樹構(gòu)成的集合)。

返回森林中的每棵樹。
來源:https://leetcode-cn.com/problems/delete-nodes-and-return-forest

如輸入一棵樹和待刪除集合[3,5]:



返回:[[1,2,null,4],[6],[7]],即樹因?yàn)楸粍h了3和5兩個(gè)節(jié)點(diǎn),所以變成了3棵樹,分別是[1,2,null,4]、[6]、[7]

思路

使用深度優(yōu)先遍歷,當(dāng)遇到待刪除節(jié)點(diǎn)時(shí),如果該節(jié)點(diǎn)有孩子節(jié)點(diǎn),那么孩子節(jié)點(diǎn)會(huì)獨(dú)立成樹,同時(shí)還需要將該節(jié)點(diǎn)和其父節(jié)點(diǎn)與左右子節(jié)點(diǎn)斷開

實(shí)現(xiàn)

 fun delNodes(root: TreeNode?, to_delete: IntArray): List<TreeNode?> {
        if (root == null) {
            return arrayListOf()
        }
        val forest = arrayListOf(root)
        reverse(root, null, true, to_delete, forest)//根節(jié)點(diǎn)沒有父節(jié)點(diǎn),所以傳null
        return forest
    }

    //isLeft表示node是parent的左節(jié)點(diǎn)還是右節(jié)點(diǎn),用于parent需要?jiǎng)h除node時(shí)確定是刪左孩子還是右孩子
    fun reverse(node: TreeNode, parent: TreeNode?, isLeft: Boolean, to_delete: IntArray, forest: ArrayList<TreeNode>) {
        node.left?.let {
            reverse(it, node, true, to_delete, forest)
        }
        node.right?.let {
            reverse(it, node, false, to_delete, forest)
        }
        if (to_delete.contains(node.value)) {//該節(jié)點(diǎn)是待刪除節(jié)點(diǎn)
            node.left?.let { forest.add(it) }//左孩子不為空,則左孩子會(huì)獨(dú)立成樹
            node.right?.let { forest.add(it) }//右孩子同理
            parent?.let { if (isLeft) parent.left = null else parent.right = null }//刪除該節(jié)點(diǎn)和其父節(jié)點(diǎn)的關(guān)聯(lián)
            node.left = null//刪除該節(jié)點(diǎn)和其子節(jié)點(diǎn)的關(guān)聯(lián)
            node.right = null
            forest.remove(node)//考慮刪除根節(jié)點(diǎn)時(shí),因?yàn)楦?jié)點(diǎn)一開始就在forest中,所以需要把它從forest中刪除
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過這...
    Winterfell_Z閱讀 6,604評(píng)論 0 13
  • 紅黑樹是平衡二叉查找樹的一種。為了深入理解紅黑樹,我們需要從二叉查找樹開始講起。 BST 二叉查找樹(Binary...
    kanehe閱讀 1,460評(píng)論 0 8
  • 前言 TreeMap作為可以對(duì)key或value進(jìn)行大小排序的map,我們在開發(fā)中也會(huì)經(jīng)常的用到,譬如說加密一串字...
    小川君閱讀 456評(píng)論 0 0
  • 一個(gè)涼爽的夜晚,我拉開椅子問問了他?!翱梢宰聛韱帷薄K戳丝次遥c(diǎn)了點(diǎn)頭。我向老板娘要了個(gè)椰子,然后坐在他旁邊,...
    Lyndon7777閱讀 271評(píng)論 0 1
  • 凌晨的歐聯(lián)杯賽場,阿森納客場3:0完勝德甲球隊(duì)法蘭克福。 因?yàn)橹坝⒊?:0領(lǐng)先沃德福德后被追平,主教練埃梅里的排...
    烏卓閱讀 210評(píng)論 1 2

友情鏈接更多精彩內(nèi)容