Java中怎么實現(xiàn) 二叉樹刪除,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
雙牌ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
二叉樹刪除要分為三種情況。
第一種:如果為葉子結(jié)點,則可以直接刪除,如圖一。
第二種:如果只有左子樹或者只有右子樹的時候,只要令其左子樹或右子樹為其父節(jié)點的左子樹或右子樹即可,如圖二。
第三種:如果節(jié)點既有左節(jié)點,又有右節(jié)點,則我們需要先用中序序列中節(jié)點的前驅(qū)或后序替換該節(jié)點,然后刪除其前驅(qū)或后序節(jié)點。此時該節(jié)點的前驅(qū)或后序節(jié)點必然是沒有右孩子或者左孩子的節(jié)點,刪除方法可以參照第二種,如圖三。
輸入:待刪除元素ele
輸出:在二叉查找樹中刪除ele
代碼:
public Object remove(Object ele){ BinTreeNode v = (BinTreeNode)binTSearch(root,ele);if (v==null) return null; //查找失敗BinTreeNode del = null; //待刪結(jié)點BinTreeNode subT = null; //待刪結(jié)點的子樹if (!v.hasLChild()||!v.hasRChild()) //確定待刪結(jié)點del = v;else{ del = getPredecessor(v); Object old = v.getData(); v.setData(del.getData()); del.setData(old); } startBN = del.getParent(); //待平衡出發(fā)點 *//此時待刪結(jié)點只有左子樹或右子樹if (del.hasLChild()) subT = del.getLChild();elsesubT = del.getRChild();if (del==root) { //若待刪結(jié)點為根if (subT!=null) subT.sever(); root = subT; } elseif (subT!=null){//del為非葉子結(jié)點if (del.isLChild()) del.getParent().setLChild(subT);else del.getParent().setRChild(subT); }else//del為葉子結(jié)點del.sever();return del.getData(); }
看完上述內(nèi)容,你們掌握J(rèn)ava中怎么實現(xiàn) 二叉樹刪除的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!