二叉搜尋樹的建立

2021-10-02 05:46:52 字數 2516 閱讀 6263

二叉搜尋樹又稱二叉排序樹, 最基本形態就是一顆空樹,它具有以下乙個性質:

· 如果乙個節點有左子樹, 那麼左子樹上的節點值都小於該節點

· 如果乙個節點有右子樹, 那麼右子樹上的節點值都大於該節點

最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為: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...