在n個動態的整數中搜尋某個整數?(檢視其是否存在)
假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度:o(n)。如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度:o(logn) 但是新增、刪除的平均時間複雜度是 o(n)
針對這個需求,有沒有更好的方案?
今天我們主要講的就是二叉搜尋樹,使用二叉搜尋樹,新增、刪除、搜尋的最壞時間複雜度均可優化至:o(logn)。
樹是一種資料結構,比如二叉樹、b樹、紅黑樹等等,也有3叉樹等等。但是並不是每種樹都用實際的作用。樹這種資料結構之所以在程式設計中很有作用,是因為它的某些獨特的特性剛好滿足一些實際的需求。那我們今天開始先學習二叉搜尋樹。
二叉搜尋樹是二叉樹的一種,是應用非常廣泛的一種二叉樹,英文簡稱為 bst(binary search tree) 。又被稱為:二叉查詢樹、二叉排序樹。
特性 :
任意乙個節點的值都大於其左子樹所有節點的值
任意乙個節點的值都小於其右子樹所有節點的值
它的左右子樹也是一棵二叉搜尋樹
作用和要求 :
二叉搜尋樹可以大大提高搜尋資料的效率
二叉搜尋樹儲存的元素必須具備可比較性
比如 int、double 等
如果是自定義型別,需要指定比較方式
不允許為 null
下圖就是乙個二叉搜素樹:【可以對照下圖來理解二叉搜尋樹的星性質】
案例:比如將數字12 插入到上述的這顆二叉樹中,那麼它的插入思路是什麼了?
找到父結點parent
建立新的結點
parent.left = node 或者 parent.right= node
具體的我們來走一下:
12 先和根結點的值13進行相比,12<13,所以,12在根結點的左子樹上
12與root.left的結點相比較,也就是9。12>9,所以12在以9為根結點的右子樹上
所以12與node(9).right也就是11進行比較,12>11,所以12在node(11)結點的右邊
最後發現node(11).right == null ,所以12 就插到node(11)的right結點上
插入後的二叉搜尋樹,也滿足二叉搜素樹的性質
二叉樹,可以使用陣列或者鍊錶的資料結構來儲存這些結點資訊。本文的**使用的是鍊錶這種資料結構。【其中t是泛型】
定以乙個結點類node
class node
}
新增元素的方法,也就是構建二叉樹方法
func add(element: t)
var node = root
var parent = root
var cmp = 0
while node != nil
cmp = bstcompare(e11:element, e12: cnode.element)
parent = node
if cmp > 0 else if cmp < 0 else
}//插入到父結點的哪個位置
let newnode = createnode(element: element, parent: parent)
if cmp > 0 else
afteradd(node: node)
capacity += 1
}
其中bstcompare(),
1. e1==e2,return 0
2. e1 > e2, return 1
3. e1 < e2, return -1
private func bstcompare(e11: t, e12: t) -> int
開始插入結點時,root == null,所以直接建立結點node,並root= node ,然後返回
然後插入第二個結點,如果第二個結點的值小於root的值,則第二個結點為root的左結點,反之為右結點。
後序插入第
三、第四...個結點,就像插入結點12一樣。找到其父結點,然後插入即可。
今天主要介紹了二叉搜尋樹這種資料結構和特性,以及如何構建一顆二叉搜尋樹。最後提示下,如果使用中序遍歷這顆二叉搜素樹,你會得到乙個公升序的list。
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
是否完全二叉搜尋樹(資料結構 二叉搜尋樹)
題目 將一系列給定數字順序插入乙個初始為空的二叉搜尋樹 定義為左子樹鍵值大,右子樹鍵值小 你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。輸入格式 輸入第一行給出乙個不超過20的正整數n 第二行給出n個互不相同的正整數,其間以空格分隔。輸出格式 將輸入的n個正整數順序插入乙個初始為空...
資料結構(二叉搜尋樹)
二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...