简单二叉搜索树 java实现
来源:互联网 发布:普罗米修斯白板软件 编辑:程序博客网 时间:2024/04/30 16:03
二叉搜索树是一种特殊的二叉树:
二叉搜索树也叫作二叉排序树、二叉查找树、有序二叉树、、、满足以下性质:
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;elsecurrent = 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;elseparent.rightChild =current.leftChild;}else if(current.leftChild==null){//只有左子节点if(current==root)root =current.rightChild;else if(isLeftChild)parent.leftChild = current.rightChild;elseparent.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 0
- 简单二叉搜索树的JAVA实现。
- 简单二叉搜索树 java实现
- java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- Java实现二叉搜索树
- 二叉搜索树JAVA实现
- Java实现二叉搜索树
- 二叉搜索树Java实现
- 二叉搜索树 java实现
- Java实现二叉搜索树
- 搜索二叉树的简单实现
- 一个简单的二叉搜索树实现
- 二叉搜索树实现简单字典
- 用二叉搜索树实现简单字典
- Java实现简单二叉树
- 【java】二叉搜索树的实现
- 二叉搜索树之Java实现
- 机器学习与scikit-learn(一)——回归模型
- getRequestDispatcher()与sendRedirect()的区别
- 06使用NanoPiM1Plus在Android4.4.2下接U盘
- MyBatis自动扫描和自定义类注解
- phalcon devtools windows 配置
- 简单二叉搜索树 java实现
- ERROR ITMS-90032的解决办法
- python 移动文件或文件夹操作
- 【头条】谁在为亚洲单体容量最大的数据中心保驾护航?
- 使用数组来储存中文(字符串)
- 人工智能中的道德伦理
- java培训学习之Java面向对象的特征
- iOS编程基础-OC(七)-运行时系统(续)
- 利用Docker Compose 搭建Spark 集群