二叉排序樹

什么是二叉排序樹

二叉排序樹:或者是一棵空樹辽俗,或者是具有下列性質(zhì)的二叉樹:

  1. 若它的左子樹不空,則左子樹上所有結(jié)點的值均小于它的根結(jié)點的值施戴;

  2. 若它的右子樹不空壁榕,則右子樹上所有結(jié)點的值均大于它的根結(jié)點的值;

  3. 它的左任内、右子樹也分別為二叉排序樹撵渡。

public class BinarySearchTree<T extends Comparable> {
    private Node<T> root;

    public Node<T> getRoot() {
        return root;
    }

    public void setRoot(Node<T> root) {
        this.root = root;
    }
//...
}

查找

在排序樹b中查找x的過程為:

  1. 若b是空樹,則搜索失敗死嗦,否則:

  2. 若x等于b的根節(jié)點的數(shù)據(jù)域之值趋距,則查找成功;否則:

  3. 若x小于b的根節(jié)點的數(shù)據(jù)域之值越除,則搜索左子樹节腐;否則:

  4. 查找右子樹外盯。

 /**
     * 查找
     * @param root
     * @param data
     * @return
     */
    public Node<T> searchBST(Node root, T data) {
        if (root == null) {
            return root;
        } else {
            if (root.getValue().compareTo(data) == 0) {
                return root;
            } else if (root.getValue().compareTo(data) < 0) {
                return searchBST(root.getLeft(), data);
            } else {
                return searchBST(root.getRight(), data);
            }
        }
    }

刪除

 /**
     * 刪除二叉查找樹上的某一個節(jié)點
     * 1. 若是葉子節(jié)點,對此節(jié)點刪除不影響整體樹的結(jié)構(gòu)翼雀,只需修改雙親節(jié)點即可
     * 2. 若是只有左子樹或只有右子樹的節(jié)點
     * 3. 若是左子樹和右子樹都在的節(jié)點
     */
    public boolean deleteBST(T data) {
        Node currentNode = root;//所刪節(jié)點
        Node parentNode = root;//所刪除節(jié)點的父節(jié)點
        boolean isLeft = false; //是否是父節(jié)點的左子樹
        //查找
        while (currentNode != null && currentNode.getValue() != data) {
            parentNode = currentNode;
            int cResult = data.compareTo(currentNode.getValue());
            if (cResult > 0) {
                currentNode = currentNode.getRight();
                isLeft = false;
            } else if (cResult < 0) {
                currentNode = currentNode.getLeft();
                isLeft = true;
            }
        }
        if (currentNode == null) {
            System.out.println("delete err: not found this node");
            return false;
        }
        //假設(shè)是葉子節(jié)點
        if (currentNode.getLeft() == null && currentNode.getRight() == null) {
            if (currentNode == root) {
                root = null;
            } else if(isLeft){
                parentNode.setLeft(null);
            }else{
                parentNode.setRight(null);
            }
            return true;
        }
        if (currentNode.getRight() == null) {
            if (currentNode == root) {
                root = currentNode.getLeft();
            } else if (isLeft) {
                parentNode.setLeft(currentNode.getLeft());
            } else {
                parentNode.setRight(currentNode.getLeft());
            }
        } else if (currentNode.getLeft() == null) {
            if (currentNode == root) {
                root = currentNode.getRight();
            } else if (isLeft) {
                parentNode.setLeft(currentNode.getRight());
            } else {
                parentNode.setRight(currentNode.getRight());
            }
        } else if (currentNode.getLeft() != null && currentNode.getRight() != null) {
            //都不為空的情況,找到前驅(qū)或后繼(該節(jié)點左子樹的最大數(shù)饱苟、右子樹的最小樹)
            //1.先找到前驅(qū)或后繼節(jié)點 賦值 刪除
            //2.移動位置
            Node tmpNode = currentNode.getRight();//后繼
            Node tmpParentNode = tmpNode;
            while (tmpNode.getLeft() != null) {
                tmpParentNode = tmpNode;
                tmpNode = tmpNode.getLeft();
            }
            if(tmpNode != currentNode.getRight()){
                tmpParentNode.setLeft(tmpNode.getRight());
            }else{
                currentNode.setRight(tmpNode.getRight());
            }
            currentNode.setValue(tmpParentNode.getValue());
        }
        return true;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狼渊,隨后出現(xiàn)的幾起案子箱熬,更是在濱河造成了極大的恐慌,老刑警劉巖狈邑,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城须,死亡現(xiàn)場離奇詭異,居然都是意外死亡官地,警方通過查閱死者的電腦和手機酿傍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱入,“玉大人赤炒,你說我怎么就攤上這事】鹘希” “怎么了莺褒?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雪情。 經(jīng)常有香客問我遵岩,道長,這世上最難降的妖魔是什么巡通? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任尘执,我火速辦了婚禮,結(jié)果婚禮上宴凉,老公的妹妹穿的比我還像新娘誊锭。我一直安慰自己,他們只是感情好弥锄,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布丧靡。 她就那樣靜靜地躺著,像睡著了一般籽暇。 火紅的嫁衣襯著肌膚如雪温治。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天戒悠,我揣著相機與錄音熬荆,去河邊找鬼。 笑死绸狐,一個胖子當(dāng)著我的面吹牛惶看,可吹牛的內(nèi)容都是我干的捏顺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纬黎,長吁一口氣:“原來是場噩夢啊……” “哼幅骄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起本今,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拆座,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冠息,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挪凑,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年逛艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏碳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡散怖,死狀恐怖菇绵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镇眷,我是刑警寧澤咬最,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站欠动,受9級特大地震影響永乌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜具伍,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一翅雏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧人芽,春花似錦望几、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衙伶。三九已至祈坠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矢劲,已是汗流浹背赦拘。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芬沉,地道東北人躺同。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓阁猜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹋艺。 傳聞我的和親對象是個殘疾皇子剃袍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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