java--二叉樹增刪改查詳解
阿新 • • 發佈:2018-12-13
二叉樹的刪除和修改
- 二叉樹的刪除比較複雜。你要先找到要刪除的結點。要刪除的結點物件並不一定要刪除。因為通過函式呼叫得到的只是他的副本。並不會真正的把他刪掉。你只要讓他不在樹上就ok了。讓刪除結點的父節點,左右孩子結點用新的結點來指向就把該結點從樹上刪除了。
然後找到要插入的結點。
找法有三種情況:
- 刪除結點有左孩子 這種情況下,找到左孩子的最右孩子。找到的結點是要上去的結點。如果該左孩子沒有右孩子,則該左孩子是要上去的結點。
- 刪除結點沒有左孩子,有右孩子 要上去的結點是最右孩子。
- 刪除結點沒有孩子(葉節點) 這種情況直接讓指向他的父結點指向空就行了,就把他從樹上刪除了。
注意事項: 原來刪除結點的左右孩子結點和父結點不用管,只要把該插入結點的值給刪除結點就行了,同時你還要把上去的結點的孩子結點處理一下。以便不影響後續操作。
雖然說得有些繞,不過其實也沒什麼東西。就是把插入結點的值給刪除節點。然後做一下交接,不能影響後續的操作,也不要破壞二叉排序樹的性質就行了。建議在紙上畫一個排序樹,然後試著刪除一個結點,看看怎麼處理上去的結點。
下面看程式碼:
public void Delete(Tree root,int value) { Tree temp=new Tree(); temp=Select(root, value); if(temp.value==0) { System.out.println("你要刪除的數值"+value+"不存在"); } else { Tree p=new Tree(); Tree node=new Tree(); Tree parent=new Tree(); p=p.Select(root, value); //p是要刪除的結點 node=p; if(p!=null) { if(p.left!=null) { p=node.left; while(p.right!=null) { p=p.right; } node.value=p.value; if(node.left.right==null) { node.left=p.left; } else{ p.parent.right=p.left; } } else if(p.right!=null) { p=p.right; node.value=p.value; node.left=p.left; node.right=p.right; } else { if(p.equals(p.parent.left)) { p.parent.left=null; } if(p.equals(p.parent.right)) { p.parent.right=null; } }System.out.println(""); System.out.println("資料"+value+"刪除成功"); } } }
System.out.println("樹初始化序列為:");
init.Bst(tree[0]);
init.Delete(tree[0], 18);
init.Bst(tree[0]);
System.out.println("");
init.Delete(tree[0], 88);
init.Bst(tree[0]);
- 更新操作比較簡單: 呼叫select和delete和insert函式就可以 先把他從樹上刪除,然後再insert到樹上
public void Update(Tree root,int value,int update) { Tree temp=new Tree(); temp=temp.Select(root, value); if(temp.value==value) { Delete(root,value); Tree a= new Tree(update); insert(root,a); System.out.println("資料"+value+"成功更新成"+update); } else { System.out.println("資料"+value+"更新失敗"); } }