搜尋二叉樹,又叫排序二叉樹、二叉查詢樹。它是一棵空樹或者具有以下性質:
1. 每個結點上都有作為搜尋依據的關鍵碼,所在結點的關鍵碼互不相同。
2. 左子樹上的所有結點小於根結點。
3. 右子樹上的所有結點大於跟結點。
4. 左右子樹都可以看成搜尋二叉樹。
上圖就是乙個簡單的搜尋二叉樹。介紹完搜尋二叉樹,接下來簡要說一下它的實現。用乙個結構體儲存它的結點資訊,然後再去建立它的類。
template
k>
struct
searchbinarynode
};template
k>
class
searchbninarytree
……protected:
node* _root;
};
那麼接下來進入主題實現搜尋二叉樹的插入與刪除。對於搜尋二叉樹,我們能夠發現,它的中序遍歷是按照公升序依次遍歷完所有節點的。
搜尋二叉樹的插入
對乙個搜尋二叉樹來說,它的所有結點都滿足上面的幾條性質,那麼當我們插入的時候也要根據性質去構建它。當一定要注意的是,每當我們插入乙個數字前,首先要判斷在已存在的樹中是否已存在該結點。
拿上圖所示的搜尋二叉樹為例,假如我們得到乙個二叉樹的序列是:5, 3, 4, 1, 7, 8, 2, 6, 0, 9。當前是沒有根結點的,這時第一數字插入時就要構建乙個根結點。當已經存在根結點了,我們需要判斷當前要插入的key和根結點的大小,比根結點的關鍵碼大,那就插入在右邊;比它小,即插入在左邊。步驟展示如下。
借用乙個動畫可以更形象展示這種思路。
//搜尋該元素是否存在
node*
parent
=null;
node* cur = _root;
while (cur)
else
if (cur->_key < key) //當key > 根時,在結點的右邊
else
}//2.已存在結點,判斷key值與結點的大小
if (parent
->_key > key)
else
}當然在這裡,也可以用遞迴去實現插入,思路相同。都先去判斷大小,然後通過遞迴,變成尋找子樹的插入,……最後變成建立乙個根。
bool _insertr(node*& root, const k& key)
if (root->_key > key)
if (root->_key < key)
return
false;
}
二叉搜尋樹的刪除在搜尋二叉樹中刪除乙個結點,必須將刪除結點而斷開結點重新鏈結起來,保證它的性質不會改變。接下來我們分析刪除可能存在的情況。
1. 刪除葉子結點,只需將它的父親結點指向它的指標置空,然後釋放即可;
2. 如果被刪除的結點沒有左子樹或者右子樹,用它的右孩子或者左孩子結點替換它,然後在釋放;
3. 如果被刪除的結點既有左子樹也有右子樹,這時我們需要找乙個結點來替代它。這個結點就是右子樹中序遍歷下的第乙個結點,接著在處理這個結點的刪除問題。
梳理清整個邏輯,下來我們開始實現。
bool remove(const k& key)
else
if (cur->_key < key)
else
else
else
parent
->_left = cur->_right;}}
}else
if (cur->_right ==
null)
else
else
parent
->_right = cur->_left;
}
}else
//第三種情況,既含左子樹又有右子樹
cur->_key = subright->_key;
del = subright;
if (subparent->_right == subright)
subparent->_right = subright->_right;
else
subparent->_left = subright->_left;
}delete del;
return
true;}}
return
false;
}
bool _remover(node*& root, const k& key)
root->_key = subright->_key;
del = subright;
if (subparent->_right == subright)
subparent->_right = subright->_right;
else
subparent->_left = subright->_left;
}delete del;
return
true;}}
搜尋二叉樹的查詢在搜尋二叉樹上進行查詢,是從乙個根結點開始,沿著乙個分支逐層向下比較判斷。可以看作是乙個遞迴的過程。如果當我們已經找到最後乙個結點,還沒有找到,那就查詢失敗;如果查詢到等於關鍵碼,那就查詢成功。接下來分別給出迭代和遞迴的搜尋演算法。
bool find(const k& key) //迭代
return
false;
}bool _findr(node* root, const k& key) //遞迴
二叉樹 還原二叉樹 二叉搜尋樹
先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...