1. 程式人生 > >[Data Structure & Algorithm] 二叉排序樹

[Data Structure & Algorithm] 二叉排序樹

二叉排序樹 BST

  • 性質
    • 若左子樹非空,則左子樹上所有記錄的值<(=)根記錄的值
    • 若右子樹非空,則右子樹上所有記錄的值>(=)根記錄的值
    • 左右子樹本身又是一顆二叉排序樹
    • 按中序遍歷,可以得到一個遞增有序序列
  • 空樹也是二叉排序樹
    • 即 構造二叉排序樹 = 二叉排序樹的插入操作
  • 儲存 - 一般用二叉連結串列

二叉排序樹的插入

  • 基本思路
    1.如果二叉樹為空,把要插入的關鍵字作為根結點
    2.如果二叉樹不為空,將要插入的關鍵字和根結點比較,大於根結點的插入到右子樹,否則插入到左子樹

二叉排序樹的查詢

  • 基本思路
    1.將要查詢的關鍵字和根結點比較
    2.1如果=根結點,直接返回
    2.2如果>根結點,到右子樹中查詢
    2.3如果<根結點,到左子樹中查詢
    3.重複1,2,直到找到相等的值或查詢到空結點
  • 平均查詢長度 ABL
    • 含有n個結點的二叉排序樹的ABL不唯一,取決於樹的形態
      • 最慢 - (n+1)/2
        • 構造時插入順序表 - 與順序查詢相同
      • 最快 - log2n
        • 與折半查詢的判定樹的形態相同

二叉排序樹的刪除

  • 基本思路
    1.查詢要刪除的關鍵字,令p指向該關鍵字,f指向該關鍵字的父結點
    2.1 如果p為葉子結點,直接刪除
    2.2 如果
    p只存在一個子樹,將p的子樹直接和f相連
    2.3 如果p左右子樹都存在,
    方法一 - 將
    p的左子樹s(中序序列中的直接前驅)直接和f相連,再把p的右子樹作為s的右子樹
    方法二 - 將p的左(或右)子樹s(中序序列中的直接前驅(或後繼))與p交換位置,再刪除p,此時*p只會有左(或右)子樹,或者無子樹,可以參考2.2