二叉搜尋樹c 資料結構二叉搜尋樹

2021-10-11 23:23:42 字數 2213 閱讀 1965

在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...