在算法这本书上看到删除BST结点的方法,思考可以发现删除一个只有左子结点或者右子结点的结点是非常容易的,只需要返回它不为空的那个结点即可,但是如果左右结点都不为空就比较麻烦了,因为该结点的父结点只有一个空结点,T.Hibbard在1962年提出了这个算法,大概原理可以归结如下:
1、将指向即将被删除结点的链接保存为t;
2、将x指向他的后继结点min(t.right),后继结点是指t的右子树中最小的结点,这个很好理解,因为只有将这个后继结点作为根结点才能维持树的有序。
3、将x的右链接指向删除后继结点后的右子树。
4、将x的左链接指向t.left
public TreeNode deleteMin(TreeNode x) { if(x.left==null) return x.right; x.left=deleteMin(x.left); return x; } public TreeNode deleteNode(TreeNode x,int key) { if(x==null) return null; if(key<x.key) return deleteNode(x.left,key); if(key>x.key) return deleteNode(x.right,key); else { if(x.left==null) return x.right; if(x.right==null) return x.left; TreeNode t = x; x = min(x.right); x.left = t.left; x.right = deleteMin(t.right); } return x; } public TreeNode min(TreeNode x) { if(x.left==null) return x; return min(x.left); }