關(guān)于二叉搜索樹(shù)(BST)的了解

寫(xiě)在前面

最近在leetcode上做了一些關(guān)于二叉搜索樹(shù)(BST)的題目倒戏,仔細(xì)看了下關(guān)于BST的資料欺缘,這兒自己做一個(gè)簡(jiǎn)單的總結(jié)棚瘟,可能在后面的題目中也會(huì)遇到關(guān)于BST更難的題(我是按順序簡(jiǎn)單到困難)留荔,也方便查閱蝇棉。

簡(jiǎn)單介紹

樹(shù)是一種重要的數(shù)據(jù)結(jié)構(gòu)讨阻,在面試中也問(wèn)得比較多。

二叉搜索樹(shù)首先是二叉樹(shù)篡殷。二叉樹(shù)是每個(gè)節(jié)點(diǎn)最多只有兩個(gè)分支的樹(shù)結(jié)構(gòu)钝吮,通常稱作“左子樹(shù)”和“右子樹(shù)”,二叉樹(shù)的分支具有左右次序板辽,不能顛倒奇瘦。關(guān)于二叉樹(shù)有一些性質(zhì)以及存在其他的二叉樹(shù),在這我不做過(guò)多介紹劲弦。

二叉搜索樹(shù)又稱有序二叉樹(shù)耳标、排序二叉樹(shù)。因?yàn)樗墓?jié)點(diǎn)是具有一定順序的瓶您。
我們來(lái)看下它的主要性質(zhì)麻捻,通過(guò)這些主要性質(zhì)你就可以了解到二叉搜索樹(shù)是一種什么樣的二叉樹(shù)。
性質(zhì):

  1. 若任意節(jié)點(diǎn)的左子樹(shù)不空呀袱,則左子樹(shù)上所有節(jié)點(diǎn)的值均小于它的根節(jié)點(diǎn)的值贸毕;
  2. 若任意節(jié)點(diǎn)的右子樹(shù)不空,則右子樹(shù)上所有節(jié)點(diǎn)的值均大于它的根節(jié)點(diǎn)的值夜赵;
  3. 任意節(jié)點(diǎn)的左明棍、右子樹(shù)也分別為二叉查找樹(shù);
  4. 沒(méi)有鍵值相等的節(jié)點(diǎn)寇僧。

基本操作

1. 定義

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

2. 查找

流程:
a.從root節(jié)點(diǎn)開(kāi)始
b.若root值等于查找值摊腋,返回真
c.若root值小于查找值,找右節(jié)點(diǎn)
d.若root值大于查找值嘁傀,找左節(jié)點(diǎn)
e.最后都沒(méi)找到兴蒸,返回假
代碼:

def find(self, root, value):
    """
    :param root: TreeNode
    :param value: int
    :return: boolean
    """
    while root:
        if root.val == value:
            return True
        elif root.val > value:
            root = root.left
        else:
            root = root.right
    return False

3. 插入(構(gòu)造BST)

流程:
a. 從root節(jié)點(diǎn)開(kāi)始
b. 若root為空,則root為插入值
c. 循環(huán):
d. 若當(dāng)前節(jié)點(diǎn)值大于插入值细办,找左節(jié)點(diǎn)
e. 若當(dāng)前節(jié)點(diǎn)值小于插入值橙凳,找右節(jié)點(diǎn)
代碼:

def inset(self, root, num):
    """
    :param num: int
    :param root: TreeNode
    :return: TreeNode
    """
    newNode = TreeNode(num)
    ans = root
    if not root:
        return newNode
    while True:
        parent = root
        if num < root.val:
            root = root.left
            if not root:
                parent.left = newNode
                return ans
        else:
            root = root.right
            if not root:
                parent.right = newNode
                return ans

4. 刪除

根據(jù)待刪除節(jié)點(diǎn)分三種情況:
1) 沒(méi)有子節(jié)點(diǎn)
直接刪除該節(jié)點(diǎn),然后父節(jié)點(diǎn)指為空
2)只有一個(gè)子節(jié)點(diǎn)
直接刪除該節(jié)點(diǎn),然后父節(jié)點(diǎn)指向子節(jié)點(diǎn)
3)有兩個(gè)子節(jié)點(diǎn)
對(duì)于有兩個(gè)節(jié)點(diǎn)的有兩種方式岛啸,用被刪除節(jié)點(diǎn)的左子樹(shù)的最右節(jié)點(diǎn)或者右子樹(shù)的最左節(jié)點(diǎn)替代刪除節(jié)點(diǎn)钓觉,并修改相應(yīng)的最左最右的父節(jié)點(diǎn)的指針。

def deleteNode(self, root, key):
    if not root:
        print 'not find key:', key
    elif key < root.key:
        root.left = self.deleteNode(root.left, key)
    elif key > root.key:
        root.right = self.deleteNode(root.right, key)
    elif root.left and root.right:
        right_min = self.find_min(self.root.right)
        root.key = right_min.key
        root.right = self.deleteNode(root.right, right_min.key)
    elif root.left:
        root = root.left
    elif root.right:
        root = root.right
    else坚踩;
        root = None
    return root

def find_min(self, root):
    if not root.left:
        return root
    return self.find_min(root.left)

更多文章請(qǐng)?jiān)L問(wèn)我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荡灾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞬铸,更是在濱河造成了極大的恐慌批幌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴捞,死亡現(xiàn)場(chǎng)離奇詭異逼裆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赦政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)胜宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人恢着,你說(shuō)我怎么就攤上這事桐愉。” “怎么了掰派?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵从诲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我靡羡,道長(zhǎng)系洛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任略步,我火速辦了婚禮描扯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟薄。我一直安慰自己绽诚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布杭煎。 她就那樣靜靜地躺著恩够,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羡铲。 梳的紋絲不亂的頭發(fā)上蜂桶,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音也切,去河邊找鬼屎飘。 笑死妥曲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钦购。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褂萧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼押桃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起导犹,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唱凯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谎痢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磕昼,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年节猿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了票从。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滨嘱,死狀恐怖峰鄙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情太雨,我是刑警寧澤吟榴,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站囊扳,受9級(jí)特大地震影響吩翻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锥咸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一狭瞎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧她君,春花似錦脚作、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至校镐,卻和暖如春亿扁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟廓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工从祝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留襟己,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓牍陌,卻偏偏與公主長(zhǎng)得像擎浴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毒涧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 樹(shù)的概述 樹(shù)是一種非常常用的數(shù)據(jù)結(jié)構(gòu)贮预,樹(shù)與前面介紹的線性表,棧契讲,隊(duì)列等線性結(jié)構(gòu)不同仿吞,樹(shù)是一種非線性結(jié)構(gòu) 1.樹(shù)的定...
    Jack921閱讀 4,462評(píng)論 1 31
  • 1 概述 二叉搜索樹(shù),顧名思義捡偏,其主要目的用于搜索唤冈,它是二叉樹(shù)結(jié)構(gòu)中最基本的一種數(shù)據(jù)結(jié)構(gòu),是后續(xù)理解B樹(shù)银伟、B+樹(shù)你虹、...
    CodingTech閱讀 3,132評(píng)論 5 35
  • 參考兩篇其他bolg總結(jié)的二叉樹(shù):https://github.com/xy7313/lintcode/blob/...
    暗黑破壞球嘿哈閱讀 2,376評(píng)論 0 1
  • -二叉搜索樹(shù) 查找問(wèn)題:靜態(tài)查找和動(dòng)態(tài)查找售葡,靜態(tài)查找可以用二分查找-判定樹(shù),那么針對(duì)動(dòng)態(tài)查找數(shù)據(jù)如何組織忠藤?(樹(shù)的動(dòng)...
    Spicy_Crayfish閱讀 1,358評(píng)論 0 2
  • 七天養(yǎng)成一個(gè)習(xí)慣挟伙,我,要試試
    f蘩閱讀 144評(píng)論 0 0