1. 程式人生 > >二叉查詢樹(二叉排序樹)BST解析

二叉查詢樹(二叉排序樹)BST解析

 public TreeNode build(int[] aim){
    	TreeNode root=new TreeNode();
    	root.value=aim[0];
    	this.root=root;
    	for(int i=1;i<aim.length;i++){
    		insert(aim[i]);
    	}
    	return root;
    }
下面介紹BST最難的刪除節點。 刪除的節點分三種情況 1、該節點為葉子節點。這種情況直接刪除即可 2、該節點擁有左孩子或者擁有右孩子(只擁有一個)。這種情況刪除該節點,並讓father節點與其為空的左孩子或者右孩子連線即可 3、該節點左孩子與右孩子都不為空。這時候要考慮用什麼節點替代該刪除的節點,是左孩子還是右孩子。 本文采用了利用該節點右孩子的最小值來替代該節點。當然也可以用其左孩子的最大值來替代。



 public void delete(int aim){
        TreeNode current=root;
        TreeNode father=null;
        boolean isLeftNode=false;
        while(current!=null&¤t.value!=aim){
            father=current;
            if (current.value > aim)
            {    isLeftNode=true;
                current = current.left;
            }else{
                current = current.right;
                isLeftNode=false;
            }
        }
        if(current.left==null&¤t.right==null){//情況1
            if(current==root)
                root=null;
            else if(isLeftNode)
                father.left=null;
            else father.right=null;
        }else if(current.left!=null&¤t.right==null){//情況2
            if(current==root)
                root=current.left;
            else if(isLeftNode)
                father.left=current.left;
            else father.right=current.left;
        }else if(current.left==null&¤t.right!=null){
            if(current==root)
                root=current.right;
            else if(isLeftNode)
                father.left=current.right;
            else father.right=current.right;
        }else if(current.left!=null&¤t.right!=null){//情況3*
            TreeNode next=getNextNode(current);//獲取後繼節點(右孩子上的最小節點)
            if(current==root)
                root=next;
            else if(isLeftNode)
                father.left=next;
            else father.right=next;
            next.left=current.left;
        }
    }
    public TreeNode getNextNode(TreeNode root){//獲取其右孩子的最小節點
        TreeNode del=root;
        TreeNode current=root.right;
        TreeNode nextfather=null;
        TreeNode next=null;
        while(current!=null){
            nextfather=next;
            next=current;
            current=current.left;
        }
        if(next!=del.right){//該最小節點一定沒有左孩子但是可能有右孩子。如果有要將其右孩子變為被刪除節點右孩子的左孩子,見下圖示。
            nextfather.left=next.right;
            next.right=del.right;
        }
        return next;
    }

對了,BST樹的結構和普通二叉樹一樣,程式碼如下