二叉搜尋樹又稱二叉排序樹, 最基本形態就是一顆空樹,它具有以下乙個性質:
· 如果乙個節點有左子樹, 那麼左子樹上的節點值都小於該節點
· 如果乙個節點有右子樹, 那麼右子樹上的節點值都大於該節點
最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為:log2n
最差情況下,二叉搜尋樹退化為單支樹,其平均比較次數為:n
#pragma once
#include
using
namespace std;
namespace lq
template
<
class
t>
friend
class
binarysorttree;}
;template
<
class
t>
class
binarysorttree
bool
insert
(const t& val)
barsorttreen
* cur = _root;
barsorttreen
* pre =
nullptr
;while
(cur)
else
if(val > cur-
>_data)
else
} cur =
new barsorttreen
(val);if
(val < pre-
>_data)
if(val > pre-
>_data)
return
true;}
void
print()
bool
erase
(const t& val)
else
if(pcur-
>_data > val)
else}if
(pcur ==
nullptr)if
(pcur-
>_left && pcur-
>_right)
// for (; pcur2->_right; pparent2 = pcur2, pcur2->_right);
#if 0
//交換法刪除 將替換的值放在要刪除的地方 然後刪除替代的節點 比較簡單 但是在節點比較大的時候 效率比較低
if(pparent2-
>_data > pcur2-
>_data)
else
//一定要先鏈結節點 然後再換值 不然錯誤
swap
(pcur2-
>_data, pcur-
>_data)
;delete pcur2;
#endif
//代替節點交代上下文關係
if(pparent2-
>_data > pcur2-
>_data)
else
// 這一點一定要先做 如果值換掉了之後在掛的話 那麼裡面的值已經變了 會發生錯誤
pcur2-
>_left = pcur-
>_left;
pcur2-
>_right = pcur-
>_right;
if(pparent-
>_left == _root)
else
else
}//被刪節點交代關係
delete pcur;
return
true;}
else
if(pcur-
>_left)
else
delete pcur;
}else
if(pcur-
>_right)
else
delete pcur;
}else
else
}return
true;}
~binarysorttree()
barsorttreen
*find
(const t& data)
barsorttreen
* pcur = _root;
while
(pcur)
else
}return
nullptr;}
private
:void
_print
(barsorttreen
* root)
}void
destoy
(barsorttreen
*& root)
//必須是& 不然是形參的拷貝 出錯}}
;};
測試函式
void
testtree()
樹還有未完善的地方例如 沒有增加迭代器 不可以一起插入多個,刪除多個,完善也比較簡單。 二叉搜尋樹的建立
二叉搜尋樹 二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。1.結...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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...
陣列建立二叉搜尋樹
最近學習了一下用陣列建立二叉搜尋樹,感覺自己又提高了一點點,好高興!下面寫個模板,功能是 輸入 n 接下來輸入 n 個數,建立二叉搜尋樹。include include include include include using namespace std int arr 1000 void set...