樹_01二叉樹增刪改查遍歷

遍歷 http://blog.csdn.net/baoendemao/article/details/39007627

數(shù)組缺點(diǎn): 增刪慢
鏈表缺點(diǎn): 查找慢

二叉排序樹結(jié)合了兩者的優(yōu)點(diǎn);

二叉排序樹
Paste_Image.png

二叉排序樹的特點(diǎn):

1棚点、若它的左子樹不空, 則左子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)構(gòu)的值;
2早处、若它的右子樹不空, 則右子樹上所有結(jié)點(diǎn)的值均小于它的根結(jié)構(gòu)的值;
3、它的左子樹和右子樹都是二叉排序樹;

關(guān)于二叉排序樹的增刪改查:

二分查找:
public Node find(Node root,Key k){
    if (root==null){
        return null;
    }
    if (key==null){
        return null;
    }
    if(key.compareTo(root.key)==0){
        return root;
    }
    if(key.compareTo(root.key)<0){
        return find(root.left,key);
    }
    if(key.compareTo(root.key)>0){
        return find(root.right,key);
    }
}

最壞情形下二叉排序樹的查找時(shí)間復(fù)雜度為O(n), 即如下圖所示的worst case:

二叉排序樹的三種情形.png

所以實(shí)際應(yīng)用中并不會(huì)使用二叉排序樹,會(huì)使用二叉排序樹的幾種衍生樹;

增刪查:


public class BinaryTreeNode{
    int mData;
    BinaryTreeNode mLeft;
    BinaryTreeNode mRight;
    BinaryTreeNode mParent;
}
public class BinarySearchTree {
    private BinaryTreeNode mRoot;
    public BinarySearchTree(BinaryTreeNode root){
        mRoot = root;
    }
    //查找
    public BinaryTreeNode search(int data){
        return search(mRoot,data);
    }
    public BinaryTreeNode search(BinaryTreeNode node,int data) {
        if (node == null || node.mData == data){
            return node;
        }
        if (data < node.mData){
            return search(node.mLeft, data);
        } else {
            return search(node.mRight, data);
        }
    }
    
    //插入
    public void insert(int data){
        if (mRoot == null){
            mRoot = new BinaryTreeNode();
            mRoot.mData = data;
            return;
        }
        searchAndInsert(null,mRoot,data);
    }
    private BinaryTreeNode searchAndInsert(BinaryTreeNode parent, BinaryTreeNode node, int data){
        if (node == null){
            node = new BinaryTreeNode();
            node.mData = data;
            if (parent != null) {
                if (data < parent.mData) {
                    parent.mLeft = node;
                } else {
                    parent.mRight = node;
                }
            }
            return node;
        }
        if (data == node.mData){
            return node;
        } else if (data < node.mData) {
            return searchAndInsert(node, node.mLeft, data);
        } else if (data > node.mData) {
            return searchAndInsert(node, node.mRight, data);
        }
    }
    //刪除
    /**
     * 在整個(gè)樹中, 查找指定數(shù)據(jù)節(jié)點(diǎn)的父節(jié)點(diǎn);
     */
    public BinaryTreeNode searchParent(int data) {
        return searchParent(null, mRoot, data);
    }
    public BinaryTreeNode searchParent(BinaryTreeNode parent, BinaryTreeNode node, int data) {
        if (node == null) {
            return;
        }
        if (data == node.mData) {
            return parent;
        } else if (data < node.mData) {
            return searchParent(node, node.mLeft, data);
        } else if (data > node.mData) {
            return searchParent(node, node.mRight, data);
        }
    }
    /**
     * 刪除指定數(shù)據(jù)的節(jié)點(diǎn):
     */
    public void delete(int data) {
        if (mRoot == null || mRoot.mData == data) {//根節(jié)點(diǎn)為空或者要?jiǎng)h除的就是根節(jié)點(diǎn), 直接刪除掉 
            mRoot = null;
            return;
        }
        // 在刪除之前需要找到他的父節(jié)點(diǎn)
        // 感覺這行代碼有些多余, 如果節(jié)點(diǎn)存在, 父節(jié)點(diǎn)肯定也是存在的.
        BinaryTreeNode parent  = searchParent(data);
        if (parent  == null) {//如果父節(jié)點(diǎn)為空, 說明這個(gè)樹是空樹, 沒法刪;
            return;
        }
        //找到要?jiǎng)h除的節(jié)點(diǎn)
        BinaryTreeNode deleteNode = search(parent, data);
        //1.如果該樹左右孩子均為空, 說明該節(jié)點(diǎn)為葉子節(jié)點(diǎn), 直接刪除
        if (deleteNode.mLeft == null && deleteNode.mRight == null) {
            deleteNode = null;
            if (parent.mLeft != null && parent.mLeft.mData == data) {
                parent.mLeft = null;
            } else if (parent.mRight != null && parent.mRight.mData == data) {
                parent.mRight = null;
            }
            return;
        } else if (deleteNode.mLeft != null && deleteNode.mRight == null) {
            //2.左孩子不為空, 右孩子為空
            parent.mLeft = deleteNode.mLeft;
            deleteNode = null;
            return;
        } else if () {
            //3.左孩子為空, 右孩子不為空
            parent.mRight = deleteNode.mRight;
            deleteNode = null;
            return;
        } else if () {
            //4.左右孩子均不為空
            BinaryTreeNode right = parent.mRight;   
            while (right.mLeft != null) {
                right = right.mLeft;
            }   
            deleteNode = right;
            parent.mLeft = right;
            deleteNode = null;
            return;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘫析,一起剝皮案震驚了整個(gè)濱河市砌梆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贬循,老刑警劉巖咸包,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杖虾,死亡現(xiàn)場(chǎng)離奇詭異烂瘫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奇适,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門坟比,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嚷往,你說我怎么就攤上這事葛账。” “怎么了皮仁?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵注竿,是天一觀的道長(zhǎng)茄茁。 經(jīng)常有香客問我,道長(zhǎng)巩割,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任付燥,我火速辦了婚禮宣谈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘键科。我一直安慰自己闻丑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布勋颖。 她就那樣靜靜地躺著嗦嗡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭玲。 梳的紋絲不亂的頭發(fā)上侥祭,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音茄厘,去河邊找鬼矮冬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛次哈,可吹牛的內(nèi)容都是我干的胎署。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼窑滞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琼牧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哀卫,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巨坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后聊训,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抱究,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年带斑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼓寺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勋磕,死狀恐怖妈候,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挂滓,我是刑警寧澤苦银,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響幔虏,放射性物質(zhì)發(fā)生泄漏纺念。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一想括、第九天 我趴在偏房一處隱蔽的房頂上張望陷谱。 院中可真熱鬧,春花似錦瑟蜈、人聲如沸烟逊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宪躯。三九已至,卻和暖如春位迂,著一層夾襖步出監(jiān)牢的瞬間访雪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工囤官, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冬阳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓党饮,卻偏偏與公主長(zhǎng)得像肝陪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刑顺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • 四蹲堂、樹與二叉樹 1. 二叉樹的順序存儲(chǔ)結(jié)構(gòu) 二叉樹的順序存儲(chǔ)就是用數(shù)組存儲(chǔ)二叉樹狼讨。二叉樹的每個(gè)結(jié)點(diǎn)在順序存儲(chǔ)中都有...
    MinoyJet閱讀 1,549評(píng)論 0 7
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合柒竞。 第二章...
    SeanCheney閱讀 5,785評(píng)論 0 19
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)政供,樹與前面介紹的線性表,棧朽基,隊(duì)列等線性結(jié)構(gòu)不同布隔,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,462評(píng)論 1 31
  • 數(shù)據(jù)結(jié)構(gòu)與算法--從平衡二叉樹(AVL)到紅黑樹 上節(jié)學(xué)習(xí)了二叉查找樹。算法的性能取決于樹的形狀稼虎,而樹的形狀取決于...
    sunhaiyu閱讀 7,653評(píng)論 4 32
  • 這次培訓(xùn)是本期培訓(xùn)團(tuán)體心理輔導(dǎo)的第二次衅檀,第一次培訓(xùn)是張老師的大課內(nèi)容。 張老師帶著T3團(tuán)隊(duì)進(jìn)到教室的時(shí)候霎俩,學(xué)員已經(jīng)...
    心理學(xué)工作者_(dá)張旭蘭閱讀 385評(píng)論 0 0