[Data Structure & Algorithm] 二叉排序樹
阿新 • • 發佈:2018-11-08
二叉排序樹 BST
- 性質
- 若左子樹非空,則左子樹上所有記錄的值<(=)根記錄的值
- 若右子樹非空,則右子樹上所有記錄的值>(=)根記錄的值
- 左右子樹本身又是一顆二叉排序樹
- 按中序遍歷,可以得到一個遞增有序序列
- 空樹也是二叉排序樹
- 即 構造二叉排序樹 = 二叉排序樹的插入操作
- 儲存 - 一般用二叉連結串列
二叉排序樹的插入
- 基本思路
1.如果二叉樹為空,把要插入的關鍵字作為根結點
2.如果二叉樹不為空,將要插入的關鍵字和根結點比較,大於根結點的插入到右子樹,否則插入到左子樹
二叉排序樹的查詢
- 基本思路
1.將要查詢的關鍵字和根結點比較
2.1如果=根結點,直接返回
2.2如果>根結點,到右子樹中查詢
2.3如果<根結點,到左子樹中查詢
3.重複1,2,直到找到相等的值或查詢到空結點 - 平均查詢長度 ABL
- 含有n個結點的二叉排序樹的ABL不唯一,取決於樹的形態
- 最慢 - (n+1)/2
- 構造時插入順序表 - 與順序查詢相同
- 最快 - log2n
- 與折半查詢的判定樹的形態相同
- 最慢 - (n+1)/2
- 含有n個結點的二叉排序樹的ABL不唯一,取決於樹的形態
二叉排序樹的刪除
- 基本思路
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