二叉查詢樹最常見的操作是查詢樹中的某個關鍵字,處了普通的search之外,其還能支援minimum、maximun、successor、predecessor等查詢,對於高度為h的樹,它們都可以在o(h)時間內完成。
給定指向樹根的指標和關鍵字k,要在樹中查詢該關鍵字是否存在,如果存在,返回其指標,否為返回null。
該過程可以從樹的根節點開始進行查詢,並沿著樹下降。對碰到的每個節點x,就比較k和key[x](表示x的關鍵字)。如果這兩個關鍵字相同,則查詢結束。如果kkey[x],則繼續在x的右子樹中查詢。
比如在如下的二叉查詢樹中,為了在樹中查詢關鍵字13,要沿著從根開始的路徑15->6->7->13進行查詢。
15下面是其實現**。/ \
6 18
/ \ / \
3 7 17 20
/ \ \
2 4 13
/9
//遞迴查詢元素,找到返回關鍵字的結點指標,沒找到返回null也可以使用非遞迴的演算法,其執行效率會更高。node* searchrecursive(node *x, int k)
//非遞迴查詢元素,找到返回關鍵字的結點指標,沒找到返回null要查詢二叉查詢樹中具有最小關鍵字的元素,只要從根節點開始,沿著各節點的left指標查詢下去,直到遇到null為止。比如上面的二叉查詢樹中的最小關鍵字為2,位於從根開始最左下的位置。node* search(node *x, int k)
return x;
}
//查詢最小關鍵字查詢二叉查詢樹中最大元素是對稱的。上面的二叉查詢樹中的最大關鍵字為20,位於從根開始最右下的位置。node* searchmin(node *x)
//查詢最大關鍵字node* searchmax(node *x)
【前繼節點】
找乙個節點的前繼節點,我們分為兩種情況
如上圖中,12的前繼節點為10。
【後繼節點】
找乙個節點的後繼節點,我們分為兩種情況
給定乙個二叉查詢樹中的節點,要找出在中序遍歷下它的後繼。如果所有的關鍵字都不相同,則某一節點x的後繼即具有大於key[x]中的關鍵字中最小者的那個節點。在二叉查詢樹中,不需要對關鍵字進行任何比較即可找到該後繼。如果該節點x的右子樹非空,則x的後繼即為右子樹的最左節點;否則,其後繼y是x的最低祖先節點,且y的左兒子而是x的祖先。比如在上面的二叉查詢樹中,15的後繼為17,因為17是15的右子樹的最小關鍵字。而13的關鍵字為15,因為13沒有右子樹,而15是其最近的乙個祖先,且15的左兒子6也是其祖先。
//查詢某個結點的後繼查詢給定節點的前驅思想和上面的相反,這裡不再贅述。node* searchsuccessor(node *x)
//查詢某個結點的前驅給定一棵二叉查詢樹和乙個關鍵字,要將該關鍵字的節點刪除。首先需要找到該關鍵字所在的節點的指標p,然後具體的刪除過程可以分為幾種情況:node *searchpredecessor(node *x)
確定了要刪除的節點q之後,就要修正q的父親和子女的鏈結關係,然後把q的關鍵字內容替換掉原先p的關鍵字內容,最後把q刪除掉。
二叉搜尋樹的刪除:
在刪除之前需要從樹中查詢到這個節點,然後再針對情況來判斷如何刪除。
分為三種情況,首先是此節點沒有孩子節點,此節點有乙個孩子節點,此節點有兩個孩子節點
void delete(bintree*& root,int value)
}if(temp ==null)
return ;
delnode = temp;
// 刪除的節點被找到 根據被刪除的節點的情況來判斷
// 如果節點的沒有孩子 那麼直接刪除此節點
if(delnode->right ==null && delnode->left ==null)
if(parent && parent->right == delnode)
parent->right =null;
delete delnode;
} //如果此節點有乙個孩子
if(delnode->right != null && delnode->left==null)
else
delete delnode;
} if(delnode->left !=null&&delnode->right== null)
else
delete delnode;
} //兩個節點都不為空
if(delnode->left !=null && delnode->right !=null)
delnode->value = temp->value;
parent->left = temp->right;
delete temp;
//delete(delnode->right,temp->value);
} }
二叉搜尋樹的插入,查詢,刪除
include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...
二叉搜尋樹的查詢 插入 刪除
coding utf 8 time 2020 9 23 15 56 author julyli file bst.py class bitreenode def init self,data self.data data self.lchild none self.rchild none self....
二叉搜尋樹的插入 刪除 查詢
1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點 插入的資料之後要滿足二叉樹的性質1和2,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...