二叉查找树(Binary Search Tree),又称:二叉搜索树,二叉排序树 2020.04.17
class Node{
public Integer data = null;
public String contentString = null;
public Node leftNode = null;
public Node rightNode = null;
public Node(Integer data,String contentString) {
this.data = data;
this.contentString = contentString;
}
@Override
public String toString() {
return "Node [data=" + data + ", contentString=" + contentString + "]";
}
}
class Tree{
public Node root = null;
public boolean Insert(Node newNode) {
if(root == null) {
root = newNode;
return true;
}
Node currentNode = root;
Node parentNode = null;
while (true) {
parentNode = currentNode;
if(currentNode.data >= newNode.data) {
currentNode = currentNode.leftNode;
if(currentNode == null){
parentNode.leftNode = newNode;
return true;
}
continue;
}
if(currentNode.data < newNode.data) {
currentNode = currentNode.rightNode;
if(currentNode == null){
parentNode.rightNode = newNode;
return true;
}
continue;
}
// if(currentNode.data == newNode.data) {
// System.out.print("非法数值:与当前所有的节点重");
// return false;
// }
}
}
public void Dlr(Node treeRootNode) {
if(treeRootNode != null) {
System.out.println(treeRootNode.toString());
Dlr(treeRootNode.leftNode);
Dlr(treeRootNode.rightNode);
}
}
public String find(Integer num) {
Node currentNode = root;
while (true) {
if(currentNode == null) {
return "没有该值";
}
if(currentNode.data > num) {
currentNode = currentNode.leftNode;
continue;
}
if(currentNode.data < num) {
currentNode = currentNode.rightNode;
continue;
}
if(currentNode.data == num) {
break;
}
}
return "该值" + currentNode.toString();
}
public boolean delete(Integer num) {
Node currentNode = root;
Node parentNode = null;
boolean isLeftTree = false;
while (currentNode.data != num) {
parentNode = currentNode;
if(num >= currentNode.data){
currentNode = currentNode.rightNode;
}else {
isLeftTree = true;
currentNode = currentNode.leftNode;
}
if(currentNode == null) {
return false;
}
}
//第一种情况,是子节点
if(currentNode.rightNode == null && currentNode.leftNode == null) {
if(currentNode == root) {
root = null;
}
if(isLeftTree == true) {
parentNode.leftNode = null;
}else {
parentNode.rightNode = null;
}
return true;
}
//第二种情况,有一个子节点
if(currentNode.rightNode == null && currentNode.leftNode != null) {
if(isLeftTree == true) {
parentNode.leftNode = currentNode.leftNode;
}else {
parentNode.rightNode = currentNode.leftNode;
}
return true;
}else if(currentNode.rightNode != null && currentNode.leftNode == null) {
if(isLeftTree == true) {
parentNode.leftNode = currentNode.rightNode;
}else {
parentNode.rightNode = currentNode.rightNode;
}
return true;
}
//第三种情况,删除节点既有左节点,又有右节点,选择右子树最左边的节点来替代它
//后继节点也就是:比删除节点大的最小节点。
if(currentNode.rightNode != null && currentNode.leftNode != null) {
Node successor = getSuccessor(currentNode);
if(currentNode == root){
root= successor;
}
if(isLeftTree == true) {
parentNode.leftNode = successor;
successor.leftNode = currentNode.leftNode;
}else {
parentNode.rightNode = successor;
successor.leftNode = currentNode.leftNode;
}
return true;
}
return false;
}
public Node getSuccessor(Node delNode){
Node successorParent = delNode;
Node successor = delNode;
Node current = delNode.rightNode;
while(current != null){
successorParent = successor;
successor = current;
current = current.leftNode;
}
//将后继节点替换删除节点
if(successor != delNode.rightNode){
successorParent.leftNode = successor.rightNode;
successor.rightNode = delNode.rightNode;
}
return successor;
}
}
public class FindTree {
public static void main(String[] args) {
Tree tree = new Tree();
tree.Insert(new Node(5,"小鲍"));
tree.Insert(new Node(7,"磊少"));
tree.Insert(new Node(6,"组长"));
tree.Insert(new Node(8,"小天"));
tree.Insert(new Node(2,"杨琪"));
tree.Insert(new Node(1,"老范"));
tree.Insert(new Node(3,"洋子"));
tree.Insert(new Node(9,"杨柳"));
tree.Dlr(tree.root);
System.out.println();
System.out.println(tree.find(7));
System.out.println(tree.find(200));
// System.out.println(tree.delete(9));
// tree.Dlr(tree.root);
// tree.Insert(new Node(9,"杨柳"));
//
//
// System.out.println(tree.delete(8));
// tree.Dlr(tree.root);
// tree.Insert(new Node(8,"小天"));
System.out.println(tree.delete(2));
tree.Dlr(tree.root);
}
}