二叉樹前驅後繼概念及刪除操作
阿新 • • 發佈:2018-03-25
cnblogs ack 選擇 comment DC auto maximum 最小 back
二叉樹前驅後繼概念及刪除操作
前驅和後繼(中序遍歷)
節點的前驅:是該節點的左子樹中的最大節點。
節點的後繼:是該節點的右子樹中的最小節點。
理解圖:
查找前驅節點的代碼
/*
* 找結點(x)的前驅結點。即,查找"二叉樹中數據值小於該結點"的"最大結點"。
*/
public BSTNode<T> predecessor(BSTNode<T> x) {
// 如果x存在左孩子,則"x的前驅結點"為 "以其左孩子為根的子樹的最大結點"。
if (x.left != null)
return maximum(x.left);
// 如果x沒有左孩子。則x有以下兩種可能:
// x是"一個右孩子",則"x的前驅結點"為 "它的父結點"。
// x是"一個左孩子",則查找"x的最低的父結點,並且該父結點要具有右孩子",找到的這個"最低的父結點"就是"x的前驅結點"。
BSTNode<T> y = x.parent;
while ((y!=null) && (x==y.left)) {
x = y;
y = y.parent;
}
return y;
}
查找後繼節點的代碼
/*
* 找結點(x)的後繼結點。即,查找"二叉樹中數據值大於該結點"的"最小結點"。
*/
public BSTNode<T> successor(BSTNode<T> x) {
// 如果x存在右孩子,則"x的後繼結點"為 "以其右孩子為根的子樹的最小結點"。
if (x.right != null)
return minimum(x.right);
// 如果x沒有右孩子。則x有以下兩種可能:
// x是"一個左孩子",則"x的後繼結點"為 "它的父結點"。
// x是"一個右孩子",則查找"x的最低的父結點,並且該父結點要具有左孩子",找到的這個"最低的父結點"就是"x的後繼結點"。
BSTNode<T> y = x.parent;
while ((y!=null) && (x==y.right)) {
x = y;
y = y.parent;
}
return y;
}
刪除
理解圖:
代碼:
private BSTNode<T> remove(BSTree<T> bst, BSTNode<T> z) {
BSTNode<T> x=null;
BSTNode<T> y=null;
/*
* z: 要刪除的節點
* y: 要代替z的節點
* x: y的孩子節點。x需替代y的位置。
*
* */
if ((z.left == null) || (z.right == null) )//只有一個孩子或沒孩子。
y = z;
else//兩個孩子,尋找後繼
y = successor(z);
//選擇y下需要上調的孩子--x
if (y.left != null)
x = y.left;
else
x = y.right;
//x代替y的位置
if (x != null)
x.parent = y.parent;
if (y.parent == null)
bst.mRoot = x;
else if (y == y.parent.left)//是左孩子,則x放左邊
y.parent.left = x;
else
y.parent.right = x;
if (y != z)//如果不是孩子直接替換的情況,要把後繼節點值賦給z
z.key = y.key;
return y;
}
引用:
圖2:https://blog.csdn.net/nzh1234/article/details/31076401
代碼:http://www.cnblogs.com/skywang12345/p/3576452.html
?二叉樹前驅後繼概念及刪除操作