简单二叉搜索树 java实现

二叉搜索树是一种特殊的二叉树:

二叉搜索树也叫作二叉排序树、二叉查找树、有序二叉树、、、满足以下性质:

      1.对于每个节点,其左子节点要么为空,要么值小于该节点值。

      2.对于每个节点,其右子节点要么为空,要么值大于该节点值。

      3.没有键值相等的点。

      通俗的归纳一下性质,二叉查找树中每个节点的值都大于其左子节点,小于其右子节点(如果左右子节点存在的话)。所以二叉查找树中每个节点的左边,整棵左树都是小于它的节点;右边,整棵右树都是大于它的节点。

例如:


直接上代码:

package com.hc.test.Tree;

/**
 * 创建时间:2017年12月1日 下午1:52:06 项目名称:Test
 * 
 * @author hc
 * @version 1.0 文件名称:BinaryTree.java 类说明: 二叉搜索树实现
 */
public class BinarySearchTree {
	// 根节点
	private Node root;
	
	//寻找
	public Node find(int key) {
		Node current = root;
		while (current.iData != key) {
			if (key < current.iData)
				current = current.leftChild;
			else
				current = current.rightChild;
			if (current == null) {
				return null;
			}
		}
		return current;
	}
	//插入
	public void insert(int id) {
		Node newNode = new Node(id,  null, null);
		if (root == null)
			root = newNode;
		else {
			Node current = root;
			Node parent;
			while (true) {
				parent = current;
				if (id < current.iData) {
					current = current.leftChild;
					if (current == null) {
						parent.leftChild = newNode;
						return;
					}

				} else {
					current = current.rightChild;
					if (current == null) {
						parent.rightChild = newNode;
						return;
					}
				}
			}
		}
	}
	//中序变量
	public void inOrder(Node node){
		if(node!=null){
			//调用自身遍历节点的左子树
			inOrder(node.leftChild);
			//访问自身
			System.out.print(node.iData+"  ");
			//调用自身遍历节点的右子树
			inOrder(node.rightChild);
		}
	}
	//前序遍历
	public void preOrder(Node node){
		if(node!=null){
			//调用自身
			System.out.print(node.iData+"  ");
			//调用自身遍历节点的左子树
			preOrder(node.leftChild);
			//调用自身遍历节点的右子树
			preOrder(node.rightChild);
		}
	}
	//后序遍历
	public void postOrder(Node node){
		if(node != null){
			//调用自身遍历节点的左子树
			postOrder(node.leftChild);
			//调用自身遍历节点的右子树
			postOrder(node.rightChild);
			//调用自身
			System.out.print(node.iData+"  ");
		}
	}
	//查找最小节点
	public Node minNode(){
		Node current,last = null;
		current = root;
		while(current != null){
			last = current;
			current =current.leftChild;
		}
		return last;
	}
	//查找最大几点
	public Node maxNode(){
		Node current,last = null;
		current=root;
		while(current != null){
			last = current;
			current =current.rightChild;
		}
		return last;
	}
	
	//删除
	public boolean delete(int key) {
		//先找到该节点再删除
		Node current = root;
		Node parent =root;
		boolean isLeftChild = true;
		//查找该点
		while(current.iData != key){
			parent = current;
			if(key<current.iData){
				isLeftChild=true;
				current = current.leftChild;
			}else{
				isLeftChild=false;
				current =current.rightChild;
			}
			if(current==null){
				return false;
			}
		}
		//该点为叶子节点
		if(current.leftChild==null && current.rightChild==null){
			if(current ==root){
				root =null;
			}else if (isLeftChild){
				parent.leftChild=null;
			}else{
				parent.rightChild=null;
			}
		}else if(current.rightChild == null){
			//只有右子节点
			if(current ==root)
				root = current.leftChild;
			else if (isLeftChild)
				parent.leftChild = current.leftChild;
			else
				parent.rightChild =current.leftChild;
		}else if(current.leftChild==null){
			//只有左子节点
			if(current==root)
				root =current.rightChild;
			else if(isLeftChild)
				parent.leftChild = current.rightChild;
			else
				parent.rightChild = current.rightChild;
		}else{
			//该节点有两个子节点
			Node successor= getSuccessor(current);
			if(current ==root)
				root = successor;
			else if(isLeftChild)
				parent.leftChild=successor;
			else
                                parent.rightChild=successor;

                                successor.leftChild =current.leftChild;
		}
		return true;
	}
	//查找后继
	private Node getSuccessor(Node delNode){
		Node successorParent = delNode;
		Node successor = delNode;
		Node current= delNode.rightChild;
		while(current != null){
			successorParent = successor;
			successor =current;
			current =current.leftChild;
		}
		if(successor != delNode.rightChild){
			successorParent.leftChild = successor.rightChild;
			successor.rightChild =delNode.rightChild;
		}
		return successor;
	}
	
	
	public class Node {
		int iData;
		Node leftChild;
		Node rightChild;

		public void displayNode() {
			System.out.println(this.iData+"  ");
		}

		public Node(int iData,Node leftChild, Node rightChild) {
			super();
			this.iData = iData;
			this.leftChild = leftChild;
			this.rightChild = rightChild;
		}

		public Node() {
		}
	}

}

附录:

查找资料的时候发现一博主做的模拟工具:

http://zh.visualgo.net/zh/bst

参考:

1. java数据结果和算法

2.博客 http://blog.csdn.net/chen_zhang_yu/article/details/52412510



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现搜索的基本步骤和代码示例: 1.定义二搜索节点类 ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } ``` 2.定义二搜索类 ```java class BST { private TreeNode root; public BST() { root = null; } // 向二搜索中插入元素 public void insert(int val) { root = insert(root, val); } private TreeNode insert(TreeNode node, int val) { if (node == null) { return new TreeNode(val); } if (val < node.val) { node.left = insert(node.left, val); } else if (val > node.val) { node.right = insert(node.right, val); } return node; } // 在二搜索中查找元素 public boolean search(int val) { return search(root, val); } private boolean search(TreeNode node, int val) { if (node == null) { return false; } if (val == node.val) { return true; } else if (val < node.val) { return search(node.left, val); } else { return search(node.right, val); } } // 删除二搜索中的元素 public void delete(int val) { root = delete(root, val); } private TreeNode delete(TreeNode node, int val) { if (node == null) { return null; } if (val < node.val) { node.left = delete(node.left, val); } else if (val > node.val) { node.right = delete(node.right, val); } else { if (node.left == null) { return node.right; } else if (node.right == null) { return node.left; } TreeNode minNode = findMin(node.right); node.val = minNode.val; node.right = delete(node.right, node.val); } return node; } private TreeNode findMin(TreeNode node) { while (node.left != null) { node = node.left; } return node; } } ``` 3.测试代码 ```java public class TestBST { public static void main(String[] args) { BST bst = new BST(); bst.insert(5); bst.insert(3); bst.insert(7); bst.insert(1); bst.insert(9); System.out.println(bst.search(3)); // 输出:true bst.delete(3); System.out.println(bst.search(3)); // 输出:false } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值