概念
二叉搜尋樹又稱為二叉排序樹(可以是一棵空樹)
一般具有以下性質
1.若左子樹不為空,則左子樹上的所有節點的值均小於(大於)根節點的值
2.若右子樹不為空,則右子樹上的所有節點的值均大於(小於)根節點的值
3.左右子樹的結構以滿足上述性質
4.二叉搜尋樹一般不存在值相同的節點
**定義
template
<
class
t>
//定義結點的結構體
struct bstnode};
template
<
class
t>
//定義二叉搜尋樹的類
class
bstree
bstree
(const bstree
& bst)
:_root
(nullptr)
bstree
&operator
=(bstree bst)
~bstree()
private
: node* _root =
nullptr;}
;
二叉搜尋樹的查詢
接近於二分查詢
若根節點不為空:
1.如果根節點key==查詢key,返回true
2.如果根節點key>查詢key,在其左子樹中進行查詢
3.如果根節點key《查詢key,在其右子樹中進行查詢
否則,返回false
node*
find
(const t& val)
else
if(cur-
>_val > val)
else
}return
false
;}
二叉搜尋樹的插入
如果樹中已經存在於即將插入的節點值相同的節點,則不再插入新的節點
如果插入新的節點,那麼插入的位置是,度為1或0的結點的子節點位置
bool
insert
(const t& val)
node* cur = _root;
node* parten =
nullptr
;//插入合適的插入位置
while
(cur)
else
if(cur-
>_val > val)
else
} cur =
newnode
(val)
;//判斷放在parent的左邊還是右邊
if(parent-
>_val > val)
else
return
true
;}
二叉搜尋樹的刪除
度為0的節點可以直接刪除,不影響搜尋樹的結構
度為1的節點,刪除之後要把它的子節點,接到它的父結點上
度為2的節點,
1.找到該節點的左子樹的最右節點或者右子樹的最左節點
2.要刪除的節點的值替換成左子樹的最右節點的值或者右子樹的最左節點的值
3.真正要刪除的是替換原先節點值的最右節點或者最左節點
左子樹的最右節點是所有左子樹中的最大節點
右子樹的最左節點是所有右子樹中的最小節點
bool
erase
(const t& val)
else
if(cur-
>_val > val)
else
}//判斷是否找到了要刪除的節點
if(cur ==
nullptr
)//1.度為0的節點
if(cur-
>_left ==
nullptr
&& cur-
>_right =
nullptr)if
(parent-
>_left == cur)
else
delete
true;}
//2.度為1的節點(左孩子為空)
else
if(cur-
>_left ==
nullptr
)else
else
}delete cur;
}//3.度為1的節點(右孩子為空)
else
if(cur-
>_right ==
nullptr
)else
else
}delete cur;
}//4.度為2的節點
else
//值替換
cur-
>_val = leftmostchild-
>_val;
//刪除最左或者最右節點
if(parent-
>_left == leftmostchild)
else
delete leftmostchild;
}return
true
;}
二叉搜尋樹的中序遍歷
二叉搜尋樹的中序遍歷是有序的
void
inorder()
void
_inorder
(node* root)
}
二叉搜尋樹的銷毀
void
destory
(node* root)
}
二叉搜尋樹的拷貝
node*
copytree
(node* root)
return
nullptr
;}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...