Java实现 二叉搜索树算法(BST)
来源:互联网 发布:行为记录软件 编辑:程序博客网 时间:2024/06/05 04:23
Java实现 二叉搜索树算法(BST)
树是由节点和边构成,储存元素的集合。节点分根节点、父节点和子节点的概念。二叉树binary tree,则加了“二叉”(binary),意思是在树中作区分。 每个节点至多有两个子(child),left child & right child。二叉树在很多例子中使用,比如二叉树表示算术表达式。 其要求:每个节点比其左子树元素大,比其右子树元素小。
1、对其节点的増差删:
package com.cxg.demo.test.tree;/** * Title: Java实现 二叉搜索树算法(BST)</br> * 树是由节点和边构成,储存元素的集合。节点分根节点、父节点和子节点的概念。 * 二叉树binary tree,则加了“二叉”(binary),意思是在树中作区分。 * 每个节点至多有两个子(child),left child & right child。 * 二叉树在很多例子中使用,比如二叉树表示算术表达式。 * 其要求:每个节点比其左子树元素大,比其右子树元素小。 * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午10:11:37 */public class BinarySearchTree { //常量之根节点 public static TreeNode root; public BinarySearchTree() { this.root = null; } /** * Title: 打印二叉树</br> * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午10:53:13 * @param root */ public void toString(TreeNode root) { if (root != null) { toString(root.left); System.out.print("value = " + root.value + " -> "); toString(root.right); } } /** * Title: 添加节点</br> * 要求:每个节点比其左子树元素大,比其右子树元素小。</br> * 步骤: * 1. 从root节点开始 * 2. 如果root为空,root为插入值 * 循环: * 3. 如果当前节点值大于插入值,找左节点 * 4. 如果当前节点值小于插入值,找右节点 * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午10:25:08 * @param key 插入的节点值 * @return 新的二叉树 */ public TreeNode inster(int key){ //新增的节点 TreeNode newNode=new TreeNode(key); //根节点 TreeNode current=root; //父节点 TreeNode parent=null; //如果根节点是空的,那么新增的节点就是当根节点 if (current==null) { root=newNode; return newNode; } //如果根节点不为空 //循环 while (true) { parent=current; if (key<current.value) {//如果当前节点值大于插入值,找左节点 current=current.left; if (current==null) { parent.left=newNode; return newNode; } } else {//如果当前节点值小于插入值,找右节点 current=current.right; if (current==null) { parent.right=newNode; return newNode; } } } } /** * Title: 查找节点</br> * 其算法复杂度 : O(lgN),树深(N) * 步骤: * 1. 从root节点开始 * 2. 比当前节点值小,则找其左节点 * 3. 比当前节点值大,则找其右节点 * 4. 与当前节点值相等,查找到返回TRUE * 5. 查找完毕未找到 * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午11:00:34 * @param key 查找的节点 * @return 返回查找值 */ public TreeNode search(int key){ //根节点 TreeNode current=root; //循环 while(current!=null && key!=current.value){ if (key<current.value) {//比当前节点值小,则找其左节点 current=current.left; } else {//比当前节点值大,则找其右节点 current=current.right; } } return current; } /** * Title: 删除节点 * 步骤: * 1.找到删除节点 * 2.如果删除节点左节点为空 , 右节点也为空; * 3.如果删除节点只有一个子节点 右节点 或者 左节点 * 4.如果删除节点左右子节点都不为空 * @author: xg.chen * @param key 删除的节点 * @return */ public TreeNode delete (int key) { TreeNode parent = root; TreeNode current = root; boolean isLeftChild = false; // 找到删除节点 及 是否在左子树 while (current.value != key) { parent = current; if (current.value > key) { isLeftChild = true; current = current.left; } else { isLeftChild = false; current = current.right; } if (current == null) { return current; } } // 如果删除节点左节点为空 , 右节点也为空 if (current.left == null && current.right == null) { if (current == root) { root = null; } // 在左子树 if (isLeftChild == true) { parent.left = null; } else { parent.right = null; } } // 如果删除节点只有一个子节点 右节点 或者 左节点 else if (current.right == null) { if (current == root) { root = current.left; } else if (isLeftChild) { parent.left = current.left; } else { parent.right = current.left; } } else if (current.left == null) { if (current == root) { root = current.right; } else if (isLeftChild) { parent.left = current.right; } else { parent.right = current.right; } } // 如果删除节点左右子节点都不为空 else if (current.left != null && current.right != null) { // 找到删除节点的后继者 TreeNode successor = getDeleteSuccessor(current); if (current == root) { root = successor; } else if (isLeftChild) { parent.left = successor; } else { parent.right = successor; } successor.left = current.left; } return current; } /** * Title: 获取删除节点的后继者,删除节点的后继者是在其右节点树种最小的节点 * @author: xg.chen * @param deleteNode 删除的节点 * @return */ public TreeNode getDeleteSuccessor(TreeNode deleteNode) { // 后继者 TreeNode successor = null; TreeNode successorParent = null; TreeNode current = deleteNode.right; while (current != null) { successorParent = successor; successor = current; current = current.left; } // 检查后继者(不可能有左节点树)是否有右节点树 // 如果它有右节点树,则替换后继者位置,加到后继者父亲节点的左节点. if (successor != deleteNode.right) { successorParent.left = successor.right; successor.right = deleteNode.right; } return successor; }}
2、节点的数据接口
package com.cxg.demo.test.tree;/** * Title: 节点的数据接口,节点分左节点和右节点及本身节点值</br> * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午10:15:46 */public class TreeNode { //节点的值 int value; //左节点 TreeNode left; //右节点 TreeNode right; //节点的构造方法 public TreeNode(int value) { this.value = value; left = null; right = null; }}
3、测试单元
package com.cxg.demo.test.tree;/** * Title: BST算法测试</br> * Description: TestDemo</br> * @author xg.c * @date 2016年7月26日 上午10:44:46 */public class TestBST { public static void main(String[] args) { BinarySearchTree bst=new BinarySearchTree(); //插入节点并打印数组 bst.inster(3); bst.inster(5); bst.inster(2); bst.inster(6); bst.inster(4); bst.inster(8); bst.inster(20); bst.inster(21); bst.inster(33); bst.toString(bst.root); System.out.println(); //查询是否存在此节点 TreeNode node=bst.search(8); System.out.println("是否存在节点值为8 => " + node.value); //删除节点 TreeNode node1=bst.delete(8); System.out.println("删除后的树型节点为:"+node1.value); bst.toString(bst.root); System.out.println(); }}
0 0
- Java实现 二叉搜索树算法(BST)
- Java实现 二叉搜索树算法(BST)
- Java实现 二叉搜索树算法(BST)
- BST(二叉搜索树) Java 实现解析
- java实现二叉搜索树(BST)相关操作
- 图解:二叉搜索树算法(BST)
- 搜索二叉树(BST)的实现
- 算法复习-二叉搜索树BST的c++实现
- Data structure-5 二叉搜索树 BST--Java语言实现
- *BST(二叉搜索树)
- 二叉搜索树(BST)
- 算法-树(1)—BST(二叉搜索树)
- 算法笔记:二叉搜索树BST(未完待续)
- 算法导论—二叉搜索树(BST)
- BST二叉搜索树的查找算法
- BST 二叉搜索树 C++ 算法导论
- 算法题——Minimum Absolute Difference in BST(JAVA)二叉搜索树
- Java实现BST(二叉查找树)
- 激光雷达的文章
- [HttpPost]和[AcceptVerbs(HttpVerbs.Post)]区别
- java的内存机制以及变量的作用域
- Android recovery 下使用 updater-script 自制升级包
- matplot 动画 绘制正弦波 曲线
- Java实现 二叉搜索树算法(BST)
- 点亮单片机世界的第一盏灯
- 产品使用前的交互设计思路
- 数据结构与算法系列----凸包问题
- 第九章 档案与文件系统的压缩与打包
- <hdfs>基本操作
- 笔记②:并查集算法解析及其高级运用(POJ1182 食物链代码解析)
- 正确使用Android性能分析工具——TraceView
- 框架工作原理整理汇总