二叉搜尋樹

2021-07-30 16:47:16 字數 2641 閱讀 8456

二叉搜尋樹

【概念】

二叉搜尋樹:又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹

1、若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值

2、若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值

3、它的左右子樹也分別為二叉搜尋樹

例:此樹就是一顆二叉搜尋樹。

【操作】

—搜尋:若根節點不為空

如果根節點的key==查詢key,返回true

如果根節點的key《查詢key,在其左子樹中查詢

如果根節點的key>查詢key,在其右子樹中查詢

否則,返回false

—插入:

在向二叉搜尋樹中插入新元素時,必須先檢測這個元素是否在樹中已經存在。如果搜尋成功,說明該元素已經存在,則不進行插入;否則將新元素加入到搜尋停止的地方。

—刪除:

首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回;否則要刪除的結點可能分下面四種情況:

1、要刪除的結點無孩子結點;

2、要刪除的結點只有左孩子結點;

3、要刪除的結點只有右孩子結點;

4、要刪除的結點有左、右孩子結點;

對於上述情況,相應的刪除方法如下:

a、直接刪除該結點

b、刪除該結點且使被刪除節點的雙親結點指向被刪除節點的左孩子點;

c、刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子點;

d、在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值補 到被刪除節點中,在來處理該結點的刪除問題

源**:

template

t>

struct

binarysearchtreenode

};template

t>

class

binarysearchtree

binarysearchtree(t*a, size_t size)

}bool insert(const t&data)

node*pcur = _proot;

node*parent = null;

while (pcur)

if (parent->_key < data)

parent->_pright = new node(data);

else

if(parent->_key > data)

parent->_pleft = new node(data);

return

true;

}node* find(const t&data)

return

null;

}bool remove(const t&data)

else

if (pcur->_key>data)

else

else

//待刪除結點為右孩子

delete pcur;

}else

if (parent->_pright == null)//待刪除結點為左孩子

else

delete pcur;

}else

//左右子樹都不為空,將右子樹中最左節點交換

swap(tmp->_key, pcur->_key);

if (tmp==prev->_pright)

else

if (prev->_pleft==tmp)

delete tmp;

}return

true;}}

return

false;

}binarysearchtree& operator=(binarysearchtree&tree)

return *this;

}binarysearchtree(const binarysearchtree&tree)

:_proot(null)

if (pcur->_pright)}}

~binarysearchtree()

node*_find_min(const node&proot)

return proot;

}node*_find_max(const node&proot)

return proot;

}private:

void _destory(node*proot)

private:

binarysearchtreenode*_proot;

};

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...