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

寫在前面

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

簡單介紹

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

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

二叉搜索樹又稱有序二叉樹、排序二叉樹。因為它的節(jié)點(diǎn)是具有一定順序的。
我們來看下它的主要性質(zhì),通過這些主要性質(zhì)你就可以了解到二叉搜索樹是一種什么樣的二叉樹。
性質(zhì):

  1. 若任意節(jié)點(diǎn)的左子樹不空,則左子樹上所有節(jié)點(diǎn)的值均小于它的根節(jié)點(diǎn)的值;
  2. 若任意節(jié)點(diǎn)的右子樹不空,則右子樹上所有節(jié)點(diǎn)的值均大于它的根節(jié)點(diǎn)的值;
  3. 任意節(jié)點(diǎn)的左、右子樹也分別為二叉查找樹;
  4. 沒有鍵值相等的節(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)開始
b.若root值等于查找值,返回真
c.若root值小于查找值,找右節(jié)點(diǎn)
d.若root值大于查找值,找左節(jié)點(diǎn)
e.最后都沒找到,返回假
代碼:

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)開始
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) 沒有子節(jié)點(diǎn)
直接刪除該節(jié)點(diǎn),然后父節(jié)點(diǎn)指為空
2)只有一個子節(jié)點(diǎn)
直接刪除該節(jié)點(diǎn),然后父節(jié)點(diǎn)指向子節(jié)點(diǎn)
3)有兩個子節(jié)點(diǎn)
對于有兩個節(jié)點(diǎn)的有兩種方式,用被刪除節(jié)點(diǎn)的左子樹的最右節(jié)點(diǎn)或者右子樹的最左節(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)

更多文章請訪問我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,763評論 1 31
  • 1 概述 二叉搜索樹,顧名思義,其主要目的用于搜索,它是二叉樹結(jié)構(gòu)中最基本的一種數(shù)據(jù)結(jié)構(gòu),是后續(xù)理解B樹、B+樹、...
    CodingTech閱讀 3,199評論 5 35
  • 參考兩篇其他bolg總結(jié)的二叉樹:https://github.com/xy7313/lintcode/blob/...
    暗黑破壞球嘿哈閱讀 2,515評論 0 1
  • -二叉搜索樹 查找問題:靜態(tài)查找和動態(tài)查找,靜態(tài)查找可以用二分查找-判定樹,那么針對動態(tài)查找數(shù)據(jù)如何組織?(樹的動...
    Spicy_Crayfish閱讀 1,512評論 0 2
  • 七天養(yǎng)成一個習(xí)慣,我,要試試
    f蘩閱讀 167評論 0 0

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