資料結構 3二叉搜尋樹 BST

2021-10-03 11:16:22 字數 2708 閱讀 9158

結構體node:左結點left、右結點right、資料data

類bst:根結點root

主要功能有:新增、刪除、查詢、遍歷(前序遍歷、中序遍歷、後序遍歷、層序遍歷、深度優先搜尋、廣度優先搜尋)、高度計算

時間複雜度:

1、新增

時間複雜度為o(logn)

2、刪除

時間複雜度為o(logn)

簡單描述一下二叉搜尋樹的刪除過程,可以分為以下四種情況

a) 要刪除的節點沒有左右孩子

b) 要刪除的節點只有左孩子(用左子結點代替)

c) 要刪除的節點只有右孩子(用右子結點代替)

d) 要刪除的節點有左右孩子(用後繼結點代替)

我這裡不直接用後繼結點替代被刪除結點,而是根據左右兩顆子樹高度,選擇前繼結點或者後繼結點,有可能降低樹的高度

因此只有兩種情況:

a) 要刪除的節點沒有左右孩子

b) 要刪除的節點有孩子(根據左右兩顆子樹高度,選擇前繼結點或者後繼結點)

3、查詢

時間複雜度為o(logn)

4、遍歷

遍歷全結點,時間複雜度為o(n)

5、高度計算

遍歷全結點,時間複雜度為o(n)

總結:1、二叉樹演算法的核心是遞迴,實現二叉樹的任何功能都可通過遞迴實現

2、前序遍歷是dfs的一種

3、bfs就是層序遍歷,可以用佇列的特點來實現

4、中序遍歷是二叉搜尋樹結點從小到大排序

5、高度計算可以用前序遍歷來實現

6、遞迴處理每個分支的一半,跟二分法類似,屬於減治法或者分治法,用分治法的主定理來算t(n)=at(n/b)+f(n),f(n)∈o(nd),這裡a=1,b=2,d=0,a=bd,因此t(n)∈o(ndlogn)=o(logn)

#include

#include

//借用max函式

#include

using

namespace std;

template

<

typename t>

struct node };

template

<

typename t>

class

bstif

(root-

>data < val)

return

false;}

//刪除輔助函式

node

*del

(node

* root, t val)

else

if(root-

>data < val)

else

if(i)

else left-

>right = root-

>right;

r = left;

}else

if(i)

else right-

>left = root-

>left;

r = right;}}

root-

>left =

nullptr

; root-

>right =

nullptr

; root = r;

}return root;

}return

nullptr;}

//查詢輔助函式

bool

find

(node

* root, t val)

return

false;}

//遍歷輔助函式

void

preorder

(node

* root)

}void

inorder

(node

* root)

}void

postorder

(node

* root)

}//高度計算輔助函式

intheight

(node

* root)

return0;

}public

:bst

(t val)

~bst()

//新增

bool

insert

(t val)

//刪除

bool

del(t val)

//查詢

bool

find

(t val)

//遍歷:前序遍歷(dfs)、中序遍歷、後序遍歷、層序遍歷(bfs)

//前序遍歷

void

preorder()

//中序遍歷

void

inorder()

//後序遍歷

void

postorder()

//層序遍歷

void

levelorder()

if(nodes[i]

->right)}}

cout << endl;

}//深度優先搜尋

void

dfs(

)//廣度優先搜尋

void

bfs(

)//高度計算

intheight()

};intmain()

附上測試用例

如有不對,請大佬指出orz

資料結構 二叉搜尋樹 BST

一棵二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數 節點的右子樹只包含大於當前節點的數 所有左子樹和右子樹自身必須也是二叉搜尋樹 若輸出二叉搜尋樹的中序遍歷序列,則這個序列是非遞減 非遞增 有序的 圖1 節點有 a,b,c,d,e,f,g 葉子結點 d,e,f,g 其中結點a又被稱為根節...

資料結構 2 二叉搜尋樹(BST)

二叉搜尋樹 乙個節點的左子節點的關鍵字的值小於這個節點,右子節點的關鍵字的值大於或者等於這個父節點 在查詢過程中,用變數current來儲存正在檢視的節點,引數key是要查詢的值,查詢從root開始,因此開始把current設為根。之後,在while迴圈中,將要查詢的值,key與idata做比較。小...

資料結構之 二叉搜尋樹 二叉排序樹 BST樹

二叉搜尋樹簡稱bst樹 二叉搜素樹是二叉樹的一種,陣列這種資料結構也能夠實現對元素的快速查詢,但是對於元素的新增 刪除和更新操作,使用陣列來實現的話,就會存在較高的時間複雜度 o n 級別。對於新增 刪除 查詢操作若是要保持較低的時間複雜度可以採用二叉搜尋樹來實現。二叉搜尋樹又稱二叉排序樹,其節點之...