二叉搜尋樹
二叉搜尋樹是一以二叉樹來組織的,可以用鍊錶的資料結構來表示,每乙個結點就是乙個物件,包括以下的結構:
bstnode* _pleft;
bstnode* _pright;
bstnode* _parent;
k _key;
v _value;
二叉搜尋樹或者是一棵空樹,或者是具有以下性質的二叉樹:
1、若它的左子樹不為空,則左子樹上所有結點的值都小於根結點的值
2、若它的右子樹不為空,則右子樹上所有結點的值都大於根結點的值
3、它的左右子樹也分別為二叉搜尋樹
搜尋
基本思想:
如果根結點不為空,我們需要查詢的key等於根結點的key,返回根節點的指標;如果查詢key小於根結點的key,在其左子樹中查詢;如果查詢key大於根結點的key,在其右子樹中查詢。否則,返回false
**實現:
pnode find(const k& key)
else
}return
false;
}
插入基本思想:
空樹—->new node—>return true
非空—->搜尋需要插入的位置—->插入
**實現:
//插入
bool insert(const k& key, const v& va
//樹非空
pnode pparent =
null;
//1.找到待插入的結點的位置
while (proot)
else
}//2.插入新結點
if (key < pparent->_key)
pparent->_pleft = newnode;
if (key > pparent->_key)
pparent->_pright = newnode;
return
true;
}
刪除基本思想:
①空樹—>直接返回
②非空—>找待刪除的結點–>
不在樹中–>直接返回
在樹中
a.沒有左右孩子(和b或c合併)
b.只有左孩子
(1)根節點
(2)非根節點(兩種情況,當前結點為上一結點的左孩子、右孩子 c.只有右孩子 d.左右孩子均存在
**實現:
//刪除
bool delete(const k& key)
else
}if (pdel)
//只有右孩子
else
if (pdel->_pleft ==
null)
//左右孩子都存在
else
if (prl->_pright)//prl有右子樹
pparent->_pleft = prl;
else
pparent->_pleft =
null;
pparent->_pright = pdel->_pright;
pnode ppparent = pparent->_parent;
if (pdel == _proot)
_proot->_key = prl->_key;
else
pparent->_key = prl->_key;}}
return
false;
}
全部**:
#include
using namespace std;
template
struct bstnode
bstnode* _pleft;
bstnode* _pright;
bstnode* _parent;
k _key;
v _value;
};template
class bstree
迴圈實現//
//搜尋
pnode find(const k& key)
else
}return
false;
}//插入
bool insert(const k& key, const v& value)
//樹非空
pnode pparent =
null;
//1.找到待插入的結點的位置
while (proot)
else
}//2.插入
if (key < pparent->_key)
pparent->_pleft = newnode;
if (key > pparent->_key)
pparent->_pright = newnode;
return
true;
}//刪除
bool delete(const k& key)
else
}if (pdel)
//只有右孩子
else
if (pdel->_pleft ==
null)
//左右孩子都存在
else
if (prl->_pright)//prl有右子樹
pparent->_pleft = prl;
else
pparent->_pleft =
null;
pparent->_pright = pdel->_pright;
pnode ppparent = pparent->_parent;
if (pdel == _proot)
_proot->_key = prl->_key;
else
pparent->_key = prl->_key;}}
return
false;
}pnode root()
private:
pnode _proot;
};void binsearchtest()
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...