它要麼是一顆空樹,要麼是具有以下性質的一顆樹:
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 ...