排序二叉树添加删除java实现

来源:互联网 发布:商标设计软件生成器 编辑:程序博客网 时间:2024/06/05 15:16


添加比较容易理解,删除在理解具体思路下用了一小时才完成 值的留念下

private static Node root;public static void remove(Node n){/** * 1、找到对应节点的父节点p,并且判断当前节点是父节点p的左(l) 或 右(r)节点 * 2、根据当前节点是否有子节点分3种情况处理 * 3、如果左右节点都不为空,那真实删除的节点就是 左边最大 或者 右边最小 的节点, *    然后使用实际删除的节点的值来替换当前节点即可 * 4、如果删除的节点是根节点(默认根节点为左节点)   *   */boolean isLeft = true;Node p = null;Node current = root;do{if(current.data == n.data)break;else if(current.data > n.data){p = current;current = current.left;isLeft = true;}else if(current.data < n.data){p = current;current = current.right;isLeft = false;}}while(current != null);if(current != null){Node l = current.left;Node r = current.right;if(l == null && r == null){if(isLeft)p.left = null;elsep.right = null;}else if(l == null){current.right = null;if(isLeft)p.left = r;elsep.right = r;}else if(r == null){current.right = null;if(isLeft)p.left = l;elsep.right = l;}else{Node needReplace = current;if(isLeft){current = current.right;while(current.left != null)current = current.left;}else{current = current.left;while(current.right != null)current = current.right;}remove(current);needReplace.data = current.data;}}}public static void main(String[] args) {int[] arr = {29,5,37,1,25,31,40,15,26,30,36,20,35,17,32,18,33,19,34};for(int i : arr)add(i);levelTravel(root);remove(new Node(370)); // 如果有兴趣可以多换几个数字测试下,25 ,31是比较复杂的删除System.out.println();levelTravel(root);}static class Node{int data;          Node left;          Node right;         public Node(int data) {              this.data = data;          }          public String toString(){              return "[data=" + data + "]";          }  }public static void add(int ele){if(root == null)root = new Node(ele);else{Node current = root,  p = null;int d = 0;do{p = current;d = ele - current.data;if(d > 0)current = current.right;else if(d < 0)current = current.left;elsereturn ;}while(current != null);Node n = new Node(ele);if(d > 0)p.right = n;elsep.left = n;}}public static void levelTravel(Node root){int h = 0, r = 0;Node[] arr = new Node[100];arr[r++] = root;while(h<r){Node n = arr[h++];System.out.print(n.data+" ");if(n.left != null)arr[r++]=n.left;if(n.right != null)arr[r++]=n.right;}}


0 0
原创粉丝点击