結構體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 級別。對於新增 刪除 查詢操作若是要保持較低的時間複雜度可以採用二叉搜尋樹來實現。二叉搜尋樹又稱二叉排序樹,其節點之...