演算法導論 二叉搜尋樹的插入和刪除

2021-06-28 03:52:40 字數 2330 閱讀 9267

,文字將繼續**如何實現二叉搜尋樹的插入和刪除節點。

在繼續之前,我們先來了解兩個概念:前驅和後繼。

後繼:如果所有的關鍵字互不相同,則乙個節點x的後繼是大於x.key的最小關鍵字的節點。

前驅:如果所有的關鍵字互不相同,則乙個節點x的前驅是小於x.key的最大關鍵字的節點。

如果聯絡二叉搜尋樹的性質:

節點的key值總是大於它的左節點(如果存在)的key值並且小於它的右節點(如果存在)的key值。那麼我們容易推知:如果乙個節點有右子樹,它後繼即是它的右子樹的最「左」端的節點,也即右子樹的最左節點,否則它的後繼位於它的某個父或祖父點,這個父或祖父節點有最後一次的左分支指向當前節點所在的子樹;而乙個節點如果有左子樹,它的前驅即是它的左子樹的最「右」端的節點,也即左子樹的最大節點,否則它的前驅位於它的某個父或者祖父節點,這個父或者祖父節點有最後一次的右分支指向當前節點所在的子樹。

了解了上面的內容,就不難給出前驅和後繼的**:

後繼:

/*

* 求x節點的後繼,後繼的key值為大於x.key的最小值

*/node* successor(node* x)

node* y = x->parent;

while (y != null && x == y->right)

return y;

}

前驅:

/*

* 求x節點的前驅,前驅的key值為小於x.key的最大值

*/node* predessor(node* x)

node* y = x->parent;

while (y != null && x == y->left)

return y;

}

插入的操作相對比較簡單,我們只需要注意滿足二叉樹節點之間的關係,以及注意樹是否為空的判斷即可,**如下:

遞迴的方式插入:

/*

* 遞迴方式插入,r:當前遞迴遍歷到的節點,pre:r的父節點,x要插入的節點

*/void tree_insert(node* pre, node* r, node*x) else if (pre->key > x->key) else

x->parent = pre;

} else else

} }void tree_insert(node* x)

非遞迴方式插入:

/*

* 插入乙個關鍵值為key的節點

*/void tree_insert(int key) else else

}if (back == null) else if (back->key > key) else

n->parent = back;

} }

二叉搜尋樹刪除節點的操作比較複雜,主要考慮以下幾種情況:

由於有兩顆子樹,所以它的後繼一定在右子樹中,且是右子樹中最小的那個節點,所以沒有左子節點。這裡又要分量小細分情況:如果這個後繼節點就是要刪除節點的右子節點,那麼使用右子節點替換原節點,再刪除原節點即可;如果這個後繼節點並不是要刪除節點右子節點,而是在右子樹的下層之中,那麼要先用後繼的右子樹替換後繼,然後再用後繼節點替換要刪除的節點。

上面提到的「替換」操作,實際上是一種節點的「移植」,我們將這個操作抽取出來,以方便使用:

/*

* 移植操作:

* 用以b為根的子樹去替換以a為根的子樹,這裡只管替換,不管a的處理,也不管b的值是否合適,

* 也不管b節點左右子樹的處理

*/void transplant(node* a, node* b)

if (a->parent == null)

if (a->parent->left == a) else

if (b != null)

}

節點的刪除操作:

void tree_delete(node* n) 

if (n->left == null) else if (n->right == null) else else

} delete n;

}

至此就完成了刪除的操作。

二叉搜尋樹的插入和刪除

include include using namespace std typedef struct nodenode,pnode void binary tree insert pnode pn,pnode pz 二叉樹插入操作 else pz parent y if y null else if...

二叉搜尋樹的插入和刪除

二叉搜尋樹的插入和刪除。bintree insert elementtype x,bintree bst 二叉搜尋樹的插入演算法 else 開始找要插入元素的位置 if xdata bst left insert x,bst left 遞迴插入左子樹 else if x bst data bst r...

演算法導論 二叉搜尋樹

搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...