資料結構 搜尋二叉樹

2021-07-26 01:26:36 字數 3387 閱讀 8261

它要麼是一顆空樹,要麼是具有以下性質的一顆樹:

1)每個節點都有乙個作為搜尋依據的關鍵碼(key),並且每個關鍵碼都不相同

2)左子樹上的所有節點的關鍵碼都小於根節點的關鍵碼

3)右子樹上的所有節點的關鍵碼都大於根節點的關鍵碼

4)左右子樹都是搜尋二叉樹

(由於它亦是乙個二叉樹,所以一些拷貝構造,析構等的基本函式這裡我就不做過多的描述了,有不太清楚的同學可以去看看我寫的有關二叉樹的那篇部落格。)

【分析思路】

:根據搜尋二叉樹的性質,我們在查詢的時候有四種情況:

當樹是空樹的時候,直接返回

當查詢的值大於當前的值,那麼就在右子樹中進行查詢

當查詢的值小於當前的值,那麼就在左子樹中進行查詢

當查詢的值等於當前的值,說明找到了

【**實現】:

1)非遞迴實現:

node* find(const k& x)

//如果要查詢的數是比當前節點大的,那麼就在左半邊找

else if(cur->_key >x)

//此處表明找到了

else

}//表明沒找到

return null;

}

2)遞迴實現

node* findr(const k& key)

node* _findr(node* root,const k& key)

【分析思路】:

1)當我們進行插入的時候,我們肯定得先找到要插入的值的合適的位置,此時就要分情況進行查詢:

當要插入的值已經存在的時候,就不能進行插入了

當要插入的值比當前的值大的時候,就必然會插入在右子樹中

當要插入的值比當前的值小的時候,就必然會插入在左子樹中

2)接下來就要進行插入了,但是我們剛才找位置的時候,已經走到了空,所以我們在尋找的時候要將進行插入的位置的前乙個位置記錄下來,然後插入到前乙個位置的下乙個位置

【**實現】:

1)非遞迴實現

//插入函式

bool insert(const k& x)

node* cur = _root;

node* parent = null; //用於記錄要插入點的前乙個節點

while(cur)

else if(cur->_key >x)

//如果要插入的值在搜尋樹中已經存在了,那麼就無法插入

else

}if(parent->_key _right = new node(x);

} else

return true;

}

2)遞迴實現

//插入函式

bool insertr(const k& key)

bool _insertr(node*& root,const k& key)

if(root->_key < key)

_insertr(root->_right,key);

else if(root->_key > key)

_insertr(root->_left,key);

else

}

【分析思路】

:對於搜尋二叉樹的刪除是比較麻煩的,要考慮的比較周密,一不小心程式就容易崩潰,它也分幾種情                          況:

當是空樹的時候,直接返回

當要刪除的節點左子樹為空,那麼直接讓它的父節點鏈上被刪除節點的下乙個節點(要分情況)

當要刪除的節點右子樹為空,那麼直接讓它的父節點鏈上被刪除節點的下乙個節點(要分情況)

當要刪除的節點的左右子樹都不為空的時候,我們才用的是替換法,我來用下面的這張圖說明下:比                           如我們現在要刪除5,那麼我們先不直接刪除5,因為直接刪除的話,整個樹就亂了,我們先去找左子 樹中最右節點(最大值的節點)或者是右子樹的最左節點(最小值)來進行替換5,然後將此節點刪除掉,然後將被刪除的(現在就是去替換的那個節點)的父節點分情況進行處理

【**實現】:

1)非遞迴實現

//刪除函式

bool remove(const k& x)

else if(cur->_key >x)

else

}if(cur == null)

return false;

//說明:根節點在第一次刪除的時候可以,但是在如果它進了這

//兩個迴圈,就會出現問題,找不到parent

//如果要刪除的節點的左子樹為空的話,

if(cur->_left == null)

else if(parent->_right == cur)

else

}//如果要刪除的節點的左子樹為空的話

else if(cur->_right == null)

else if(parent->_right == cur)

else

}//如果被刪除的節點的左右都為空的話,要用到的方法就是替換法

//根據搜尋二叉樹的特點可知:

//左子樹的最右(即為最大值)

//左子樹的最左(即為最小值)

else

cur->_key = sleft->_key;

if(parent->_left == sleft)

parent->_left = sleft->_right;

else

parent->_right = sleft->_right;

del = sleft;

} delete del;

del = null;

return true;

}

2)遞迴實現

//刪除函式

bool remover(const k& key)

bool _remover(node* &root,const k& key)

else if(root->_right == null)

else

root->_key = sleft->_key;

if(parent->_left == sleft)

parent->_left = sleft->_right;

else

parent->_right = sleft->_right;

del = sleft;

} delete del;

del = null;

return true;

}}

注意:在實現遞迴的時候,插入和刪除給的節點傳入的是引

資料結構 搜尋二叉樹

手寫實現搜尋二叉樹 class treenode treenode left son null treenode right son null treenode p null 一定儲存雙親的指標 intvalue 0 bool treeinsert treenode proot,int value ...

二叉搜尋樹c 資料結構二叉搜尋樹

在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...