package sy3.sy; import javax.print.attribute.standard.NumberUp; import java.util.PriorityQueue; import java.util.function.ObjDoubleConsumer; //节点类 public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } public void add(TreeNode node) { if (node == null) { return; } if (node.val < this.val) { 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 TreeNode search(int val) { if (this.val == val) { return this; } if (this.val < val) { if (this.right == null) { return null; } return this.right.search(val); } else { if (this.left == null) { return null; } return this.left.search(val); } } public TreeNode searchParent(int val) { if (this.left != null && this.left.val == val || this.right != null && this.right.val == val) { return this; } else { if (val < this.val && this.left != null) { return this.left.searchParent(val); } else { if (val > this.val && this.right != null) { return this.right.searchParent(val); } } } return null; } } //创建二叉树 class Creat { private TreeNode root; public TreeNode getRoot() { return root; } public void add(TreeNode node) { if (root == null) { root = node; } else { root.add(node); } } public int delRightTreeMin(TreeNode node) { TreeNode target = node; while (target.left != null) { target = target.left; } delNode(target.val); return target.val; } public void delNode(int val) { if (root == null) { return; } TreeNode targetNode = search(val); if (targetNode == null) { return; } if (root.left == null && root.right == null) { root = null; return; } TreeNode parent = searchParent(val); //删除叶子节点 if (targetNode.left == null && targetNode.right == null) { if (parent.left != null && parent.left.val == val) { parent.left = null; } else if (parent.right != null && parent.right.val == val) { parent.right = null; } //删除有两个子节点的节点 } else if (targetNode.right != null && targetNode.left != null) { int minVal = delRightTreeMin(targetNode.right); targetNode.val = minVal; } else { //删除的节点有一个左节点 if (targetNode.left != null) { if (parent != null) { if (parent.left.val == val) { parent.left = targetNode.left; } else { parent.right = targetNode.left; } } else { root = targetNode.left; } } else { //要删除的有一个右子节点 if (parent != null) { if (parent.left.val == val) { parent.left = targetNode.right;//正常删除 } else { parent.right = targetNode.right; //parent的右边的右节点 } } else { root = targetNode.right; } } } } public TreeNode search(int val) { if (root == null) { return null; } else { return root.search(val); } } public TreeNode searchParent(int val) { if (root == null) { return null; } return root.searchParent(val); } public void pre(TreeNode node) { if (node == null) { return; } System.out.print(node.val + " "); pre(node.left); pre(node.right); } public void order(TreeNode node) { if (node == null) { return; } order(node.left); System.out.print(node.val + " "); order(node.right); } } class Test { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 2}; Creat c = new Creat(); for (int i = 0; i < arr.length; i++) { c.add(new TreeNode(arr[i])); } TreeNode root = c.getRoot(); // c.order(root); TreeNode search = c.search(2); // System.out.println(search.val); // TreeNode treeNode = c.searchParent(5); // System.out.println(treeNode.val); // int i = c.delRightTreeMin(root); // System.out.println(i); c.delNode(7); c.order(root); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)