,文字將繼續**如何實現二叉搜尋樹的插入和刪除節點。
在繼續之前,我們先來了解兩個概念:前驅和後繼。
後繼:如果所有的關鍵字互不相同,則乙個節點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個結點...