資料結構 bst二叉排序樹 節點刪除
阿新 • • 發佈:2021-08-16
刪除葉子節點
刪除只有一個的子節點的
刪除有兩個子節點的
package tree.bst; public class bstDemo { public static void main(String[] args) { System.out.println("二叉排序樹"); BstTree bstTree = new BstTree(); int[] arr = {7,3,10,12,5,1,9,2}; for (int i = 0; i < arr.length; i++) { bstTree.addNode(new Node(arr[i])); } //bstTree.infixOrder(); // 刪除葉子節點 // bstTree.deleteNode(12); // System.out.println("刪除後"); // bstTree.infixOrder(); // // delete 一顆子樹的節點 // bstTree.deleteNode(1); // bstTree.infixOrder(); // delete 2顆子樹的節點 bstTree.deleteNode(10); bstTree.infixOrder(); } } class BstTree { private Node root; public void addNode(Node node) { if(root == null){ root = node; } else { root.add(node); } } public void infixOrder() { if(root == null){ return ; } root.infixOrder(); } public Node search(int value){ if(root == null){ return null; } else { return root.search(value); } } public Node searchParent(int value){ if(root == null){ return null; } else { return root.searchParent(value); } } /** * 刪除最小節點 * @param node 傳入的節點 當做一顆二叉排序書的根節點 * @return 以node為根節點的的最小節點的值 */ public int delRightTreeMin(Node node){ Node temp = node; // 迴圈查詢左子節點找到最小值 while(temp.left != null){ temp = temp.left; } // delete the mini node deleteNode(temp.value); return temp.value; } public void deleteNode(int value){ if(root == null){ return; } // find thi node Node targetNode = this.search(value); // 如果沒有找到要刪除的節點 if(targetNode == null) { return; } // 沒有父節點 if(root.left == null && root.right == null){ root = null; return ; } Node parent = searchParent(value); //葉子節點 if(targetNode.left == null && targetNode.right == null) { if(parent.left != null && parent.left.value == value){ parent.left = null; } else if(parent.right != null && parent.right.value == value){ parent.right = null; } }else if(targetNode.left!= null && targetNode.right != null) { //兩顆子樹 int min = this.delRightTreeMin(targetNode.right); targetNode.value = min; } else { // 一顆子樹 // if has left node if(targetNode.left != null) { // 如果targetNode是parent的左右 if(parent.left.value == value) { parent.left = targetNode.left; } else { parent.right = targetNode.left; } }else{ if(parent.right.value == value){ parent.right = targetNode.right; } else { parent.left= targetNode.right; } } } } } class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = value; } // find node public Node search(int value){ if(value == this.value){ return this; } else if(value < this.value){ // left tree find if(this.left == null){ return null; } return this.left.search(value); } else { if(this.right == null){ return null; } return this.right.search(value); } } // 查詢要刪除的節點的父節點 public Node searchParent(int value) { if(this.left != null && this.left.value == value ||(this.right!=null && this.right.value==value)){ return this; } else{ if(value < this.value && this.left !=null){ return this.left.searchParent(value); } else if(value >=this.value && this.right != null) { return this.right.searchParent(value); } else { return null; } } } // 新增節點 public void add(Node node){ if(node == null) { return ; } // 新增 left if(node.value < this.value){ if(this.left == null){ this.left = node; } else { this.left.add(node); } } // 新增到right if(node.value > this.value){ if(this.right == null){ this.right = node; } else { this.right.add(node); } } } // 中序便利 public void infixOrder() { if(this.left != null){ this.left.infixOrder(); } System.out.println(this); if(this.right != null){ this.right.infixOrder(); } } @Override public String toString() { return "Node{" + "value=" + value + '}'; } }