遍歷複雜度o(n)
#include
#include
using
namespace std;
// 二分搜尋樹
template
<
typename key,
typename value>
class
bst}
; node *root;
// 根節點
int count;
// 樹中的節點個數
public
:// 建構函式, 預設構造一棵空二分搜尋樹
bst(
)// 析構函式, 釋放二分搜尋樹的所有空間
~bst()
// 返回二分搜尋樹的節點個數
intsize()
// 返回二分搜尋樹是否為空
bool
isempty()
// 向二分搜尋樹中插入乙個新的(key, value)資料對
void
insert
(key key, value value)
// 檢視二分搜尋樹中是否存在鍵key
bool
contain
(key key)
// 在二分搜尋樹中搜尋鍵key所對應的值。如果這個值不存在, 則返回null
value*
search
(key key)
// 二分搜尋樹的前序遍歷
void
preorder()
// 二分搜尋樹的中序遍歷
void
inorder()
// 二分搜尋樹的後序遍歷
void
postorder()
// 二分搜尋樹的層序遍歷
void
levelorder()
}private
:// 向以node為根的二分搜尋樹中, 插入節點(key, value), 使用遞迴演算法
// 返回插入新節點後的二分搜尋樹的根
node*
insert
(node *node, key key, value value)
if( key == node-
>key )
node-
>value = value;
else
if( key < node-
>key )
node-
>left =
insert
( node-
>left , key, value)
;else
// key > node->key
node-
>right =
insert
( node-
>right, key, value)
;return node;
}// 檢視以node為根的二分搜尋樹中是否包含鍵值為key的節點, 使用遞迴演算法
bool
contain
(node* node, key key)
// 在以node為根的二分搜尋樹中查詢key所對應的value, 遞迴演算法
// 若value不存在, 則返回null
value*
search
(node* node, key key)
// 對以node為根的二叉搜尋樹進行前序遍歷, 遞迴演算法
void
preorder
(node* node)
}// 對以node為根的二叉搜尋樹進行中序遍歷, 遞迴演算法
void
inorder
(node* node)
}// 對以node為根的二叉搜尋樹進行後序遍歷, 遞迴演算法
void
postorder
(node* node)
}// 釋放以node為根的二分搜尋樹的所有節點
// 採用後續遍歷的遞迴演算法
void
destroy
(node* node)}}
;// 測試二分搜尋樹的前中後序遍歷以及層序遍歷
intmain()
cout/ 測試二分搜尋樹的size()
cout<<
"size: "
/ 測試二分搜尋樹的前序遍歷 preorder
cout<<
"preorder: "
preorder()
; cout/ 測試二分搜尋樹的中序遍歷 inorder
cout<<
"inorder: "
inorder()
; cout/ 測試二分搜尋樹的後序遍歷 postorder
cout<<
"postorder: "
postorder()
; cout/ 測試二分搜尋樹的層序遍歷 levelorder
cout<<
"levelorder: "
levelorder()
; cout
}
二分搜尋樹5 廣度優先遍歷(層序遍歷)
引入佇列的概念 將28入隊,佇列不為空,將隊首28元素取出,輸出,將其左右兩個節點入隊 16 30 將隊首16元素取出,輸出,將其左右兩個節點入隊 30 13 22 將隊首30元素取出,輸出,將其左右兩個節點入隊 13 22 29 42 迴圈這樣的操作,直到隊列為空 結果 28 16 30 13 2...
深度優先遍歷 廣度優先遍歷
用棧進行儲存元素。訪問頂點 頂點入棧,以便記住它 標記頂點,以便不會再訪問它 2 訪問規則 a.如果可能,訪問乙個鄰接的未訪問頂點,標記它,併入棧。b.當不能執行a時 沒有鄰接的未訪問頂點 如果棧不為空,就從棧中彈出乙個頂點。c.如果不能執行規則a和b,就完成了整個搜尋過程。3 實現 基於以上規則,...
廣度優先遍歷
廣度優先遍歷 breadth first search 類似於對樹的層序遍歷 遍歷規則為 首先訪問初始點vi,並將其標記為已訪問過,接著訪問vi的所有未被訪問過的鄰接點,其訪問次序可以任意,假定依次為vi1,vi2,vit,並均標記為已訪問過,然後在按照vi1,vi2,vit的次序,訪問每乙個頂點的...