二叉搜尋樹的建立 查詢 插入 刪除

2021-06-28 07:07:18 字數 2588 閱讀 1942

二叉查詢樹最常見的操作是查詢樹中的某個關鍵字,處了普通的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

node* search(node *x, int k)

return x;

}

要查詢二叉查詢樹中具有最小關鍵字的元素,只要從根節點開始,沿著各節點的left指標查詢下去,直到遇到null為止。比如上面的二叉查詢樹中的最小關鍵字為2,位於從根開始最左下的位置。

//查詢最小關鍵字  

node* searchmin(node *x)

查詢二叉查詢樹中最大元素是對稱的。上面的二叉查詢樹中的最大關鍵字為20,位於從根開始最右下的位置。

//查詢最大關鍵字

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)

查詢給定節點的前驅思想和上面的相反,這裡不再贅述。

//查詢某個結點的前驅

node *searchpredecessor(node *x)

給定一棵二叉查詢樹和乙個關鍵字,要將該關鍵字的節點刪除。首先需要找到該關鍵字所在的節點的指標p,然後具體的刪除過程可以分為幾種情況:

確定了要刪除的節點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,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...