数据结构与算法_二叉树_二叉查找树_JAVA实现

二叉查找树(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);
	}
}

有关原理讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值