搜尋二叉樹的演算法實現

2021-07-29 19:06:04 字數 3357 閱讀 2271

搜尋二叉樹,又叫排序二叉樹、二叉查詢樹。它是一棵空樹或者具有以下性質:

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 若右子樹不空,則右子...