二叉排序树
package BinarrSortTree; public class BSTTreeDemo01 { /* 二叉树排序树:比根节点小的数在左边,大的在右边 */ public static void main(String[] args) { } } //创建二叉树类 class BinarySortTree{ private Node root; public void setRoot(Node root) { this.root = root; } public Node getRoot() { return root; } //添加节点的方法 public void add(Node node){ if(root==null){ root=node; }else{ this.root.addNode(node); } } //中序遍历 public void midOrder(){ if(this.root!=null){ this.root.midOrder(); }else{ System.out.println("该树为空"); } } //删除节点: //1.查找要删除的节点 public Node search(int value){ if(root==null){ return null; } return root.search(value); } //2.查找要删除节点的父节点 public Node searchParent(int value){ if (root==null){ return null; }else{ return root.searchParent(value); } } //3.删除节点(返回删除的节点) public Node deleteNode(int value){ if(root==null){ return null; }else{ Node targetNode = root.search(value); Node ordinalNode = targetNode; Node parentNode = root.searchParent(value); if(root.value==value && root.left==null && root.right==null){ //要删除的节点是根节点 root=null; } if(targetNode==null) { return null; }else { if(targetNode.left==null&&targetNode.right==null){ //要删除的节点是叶子结点 if(parentNode.left!=null && parentNode.left.value==value){ parentNode.left=null; }else if(parentNode.right!=null && parentNode.right.value==value){ parentNode.right=null; } }else if(targetNode.right!=null && targetNode.left!=null){ //要删除的节点有两个子节点 //需要找到其右子节点向左查找的最小的节点的值(或者左子节点向右查找的最大值)写一个方法来完成 //将上一步查找的值替换掉待删除节点的值,删除最小值节点(相当于待删除节点替换为查找到的该节点 // 保留了BST的特性) int targetvalue = delRightMinvalue(targetNode.right); targetNode.value=targetvalue; }else{ //要删除的节点只有一个子节点 if(targetNode.left!=null){ //要删除的节点有左子节点 if (parentNode!=null){ if(parentNode.left.value==value){ //待删除的的节点为父节点的左子节点 parentNode.left=targetNode.left; }else{ parentNode.right=targetNode.left; } }else{ root=targetNode.left; } }else{ //要删除的节点为右子节点 if(parentNode!=null){ if(parentNode.left.value==value){ parentNode.left=targetNode.right; }else{ parentNode.right=targetNode.right; } }else{ root=targetNode.right; } } } } return ordinalNode; } } public int delRightMinvalue(Node node){ Node target = node; int value=target.value; while(target.left!=null){ target=target.left; } deleteNode(value); return value; } } //创建节点类 class Node{ int value; Node left; Node right; public Node(){ } public Node(int value){ this.value=value; } //添加节点的方法 //要求满足二叉排序树的要求 public void addNode(Node node){ if(node==null){ return; } if(node.value<this.value){ if(this.left==null){ this.left=node; }else{ this.left.addNode(node); } }else{ if(this.right==null){ this.right=node; }else{ this.right.addNode(node); } } } //中序遍历 public void midOrder(){ if(this.left!=null){ this.left.midOrder(); } System.out.println(this); if(this.right!=null){ this.right.midOrder(); } } //删除节点: //1.查找要删除的节点 public Node search(int value){//value:要删除节点的值 if(value==this.value){ return this; }else if(value<this.value){ if(this.left!=null){ return this.left.search(value); }else{ return null; } }else if(value>this.value){ if(this.right!=null){ return this.right.right.search(value); }else{ return null; } }else{ return null; } } //2.查找要删除节点的父节点 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; } } } }