二叉查詢樹(二叉排序樹)BST解析
阿新 • • 發佈:2019-01-04
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樹的結構和普通二叉樹一樣,程式碼如下