二叉搜尋樹是一種特殊的二叉樹,具有以下性質:
1. 若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值。
2. 若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值。
3. 它的左右子樹也分別為二叉搜尋樹。
空樹也是一顆二叉搜尋樹。二叉搜尋樹的中序遍歷是有序的。
二叉搜尋樹的查詢:
從根結點開始查詢,若節點為空則返回 false;若不為空:1. 若節點大小小於要查詢的節點,則從它右子樹去找;2. 若節點大小大於要查詢的節點,則從它的左子樹去找;3. 若節點大小等於要查詢的節點大小,則返回true。
二叉搜尋樹的插入:
如果為空樹,則直接插入。若樹不為空,則從根結點開始查詢合適的位置進行插入:1. 若節點大小小於插入節點,則從右子樹開始插入;2. 若節點大小大於插入節點,則從左子樹開始插入;3. 若為空節點,則將節點插入該位置。
二叉搜尋樹的刪除:
首先查詢是否存在該節點,不存在返回false。如果存在: 1. 若要刪除的節點的左子樹為空,刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子結點。2. 若要刪除的節點右子樹為空,刪除該節點且使被刪除節點的雙親節點指向被刪除節點的左孩子節點。3. 若要刪除的節點左右子樹都不為空,尋找該節點左子樹的最大節點或者右子樹的最小節點,將尋找到節點的值賦值給要刪除的節點的值,然後刪除找到的節點,代替刪除。
二叉搜尋樹的實現:
#includeusing namespace std;
templatestruct bstnode
bstnode* left;
bstnode* right;
t val;
};templateclass bstree
bstnode* find(const t& value)
return nullptr;
} bool insert(const t& value)
bstnode* cur = root;
bstnode* parent = nullptr;
while (cur)
else if (cur->val < value)
else
}cur = new bstnode(value);
if (value < parent->val)
else
return true;
} bool erase(const t& value = t())
bstnode* cur = root;
bstnode* parent = nullptr;
while (cur)
else if (cur->val < value)
else
else
}else if (cur->right == nullptr)
else
}else
cur->val = min_right->val;
if (min_right == parent->left)
else
delete min_right;
min_right = nullptr;
}return true;
}} return false;
} void inorder()
~bstree()
private:
bstnode* root;
void _inorder(bstnode* _root) }
void _destroy(bstnode* &_root) }
};int main()
二叉搜尋樹的效能分析:
對於乙個關鍵碼集合,如果插入順序不同,得到的二叉搜尋樹也不同。
查詢時間複雜度:
1. 最佳的情況下,二叉搜尋樹為完全二叉樹,時間複雜度為 o(log2n)
2. 最差的情況下,二叉搜尋樹退化為單支樹,相當於乙個鍊錶,時間複雜度為o(n)
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...