package BinarySorttreeDemo; public class BinarySorttreedemo { public static void main(String[] args) { int [] arr = {7,3,10,12,5,1,9}; BinarySortTree binarySortTree = new BinarySortTree(); for (int i = 0; i < arr.length; i++) { binarySortTree.add(new Node(arr[i])); } binarySortTree.listtree(); binarySortTree.del(7); System.out.println("删除节点后:"); binarySortTree.listtree(); } } class BinarySortTree{ private Node root; 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); } } public int delRightTreeMin(Node node){ Node target = node; while (target.left!=null){ target = target.left; } del(target.value);//删除最小节点 return target.value; } public void del(int value){ if (root == null){ return; }else { Node targetNode = search(value); if(targetNode == null){ return; }else { if(root.left==null && root.right==null){ root =null; } Node parent = searchParent(value); //如果删除节点是叶子节点 if(targetNode.left == null && targetNode.right == null){ if(parent.left!=null&&targetNode.value == parent.left.value){ parent.left=null; }else if(parent.right!=null&&targetNode.value == parent.right.value){ parent.right=null; } }else if(targetNode.left != null && targetNode.right != null){//删除节点有两个子节点 int min = delRightTreeMin(targetNode.right); targetNode.value = min; }else {//删除只有一颗子树的节点 if(targetNode.left!=null){ if (parent!=null){if(parent.left.value==value){ parent.left = targetNode.left; }else { parent.right=targetNode.left; }}else { root = targetNode.left; } }else { if(parent!=null){ if (parent.left.value==value){ parent.left = targetNode.right; }else { parent.right=targetNode.right; } }else { root = targetNode.right; } } } } } } public void add(Node node){ if(root == null){ this.root = node; }else { root.add(node); } } public void listtree(){ root.listtree(); } } class Node{ int value; Node left; Node right; public Node(int value) { this.value = value; } public Node search(int value){ if(this.value == value){ return this; } if (this.left!=null && this.value>value){ return this.left.search(value); }else if(this.right!=null && this.value<value){ return this.right.search(value); }else { return null; } } public Node searchParent(int value){ if((this.left!=null && this.left.value==value)|| (this.right!=null && this.right.value==value)){ return this; }else if(this.left!=null && this.value>value){ return this.left.searchParent(value); }else if(this.right!=null && this.value<value){ return this.right.searchParent(value); }else { return null; } } public void add(Node node){//创建二叉排序树 if(node == null){ return; } if(this.value> node.value){ if(this.left == null){ this.left = node; }else { this.left.add(node); } }else { if(this.right == null){ this.right = node; }else { this.right.add(node); } } } public void listtree(){//中序遍历 if (this.left!=null){ this.left.listtree(); } System.out.println(this.value); if (this.right!=null){ this.right.listtree(); } } }
二叉排序树删除节点(java)
于 2022-07-01 11:09:24 首次发布