- 浏览: 404963 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
junchao_qin:
[img][flash=200,200][url][img]引 ...
MyEclipse中使用VSS插件 -
tigerwood008:
IE11不好用!!
js弹出窗口 + 获取上传文件全路径 -
TheMatrix:
$.ajaxSetup({async : false});这种 ...
jquery 中的post和get方法如何同步 -
多多成长记:
Blazeds与java通信 -
ZED.CWT:
[align=ceiinter][/align]
java中利用JFrame创建窗体 【转】
转自:http://blog.csdn.net/zyj8170/article/details/7045226
- /**
- * @author zyj8170 2011-2-13
- *
- * 此程序实现一个二叉查找树的功能,可以进行动态插入、删除关键字;
- * 查询给定关键字、最小关键字、最大关键字;转换为有序列表(用于排序)
- *
- *
- */
- import java.util.ArrayList;
- import java.util.List;
- public class BinarySearchTree {
- // 树的根结点
- private TreeNode root = null ;
- // 遍历结点列表
- private List<TreeNode> nodelist = new ArrayList<TreeNode>();
- private class TreeNode {
- private int key;
- private TreeNode leftChild;
- private TreeNode rightChild;
- private TreeNode parent;
- public TreeNode( int key, TreeNode leftChild, TreeNode rightChild,
- TreeNode parent) {
- this .key = key;
- this .leftChild = leftChild;
- this .rightChild = rightChild;
- this .parent = parent;
- }
- public int getKey() {
- return key;
- }
- public String toString() {
- String leftkey = (leftChild == null ? "" : String
- .valueOf(leftChild.key));
- String rightkey = (rightChild == null ? "" : String
- .valueOf(rightChild.key));
- return "(" + leftkey + " , " + key + " , " + rightkey + ")" ;
- }
- }
- /**
- * isEmpty: 判断二叉查找树是否为空;若为空,返回 true ,否则返回 false .
- *
- */
- public boolean isEmpty() {
- if (root == null ) {
- return true ;
- } else {
- return false ;
- }
- }
- /**
- * TreeEmpty: 对于某些二叉查找树操作(比如删除关键字)来说,若树为空,则抛出异常。
- */
- public void TreeEmpty() throws Exception {
- if (isEmpty()) {
- throw new Exception( "树为空!" );
- }
- }
- /**
- * search: 在二叉查找树中查询给定关键字
- *
- * @param key
- * 给定关键字
- * @return 匹配给定关键字的树结点
- */
- public TreeNode search( int key) {
- TreeNode pNode = root;
- while (pNode != null && pNode.key != key) {
- if (key < pNode.key) {
- pNode = pNode.leftChild;
- } else {
- pNode = pNode.rightChild;
- }
- }
- return pNode;
- }
- /**
- * minElemNode: 获取二叉查找树中的最小关键字结点
- *
- * @return 二叉查找树的最小关键字结点
- * @throws Exception
- * 若树为空,则抛出异常
- */
- public TreeNode minElemNode(TreeNode node) throws Exception {
- if (node == null ) {
- throw new Exception( "树为空!" );
- }
- TreeNode pNode = node;
- while (pNode.leftChild != null ) {
- pNode = pNode.leftChild;
- }
- return pNode;
- }
- /**
- * maxElemNode: 获取二叉查找树中的最大关键字结点
- *
- * @return 二叉查找树的最大关键字结点
- * @throws Exception
- * 若树为空,则抛出异常
- */
- public TreeNode maxElemNode(TreeNode node) throws Exception {
- if (node == null ) {
- throw new Exception( "树为空!" );
- }
- TreeNode pNode = node;
- while (pNode.rightChild != null ) {
- pNode = pNode.rightChild;
- }
- return pNode;
- }
- /**
- * successor: 获取给定结点在中序遍历顺序下的后继结点
- *
- * @param node
- * 给定树中的结点
- * @return 若该结点存在中序遍历顺序下的后继结点,则返回其后继结点;否则返回 null
- * @throws Exception
- */
- public TreeNode successor(TreeNode node) throws Exception {
- if (node == null ) {
- return null ;
- }
- // 若该结点的右子树不为空,则其后继结点就是右子树中的最小关键字结点
- if (node.rightChild != null ) {
- return minElemNode(node.rightChild);
- }
- // 若该结点右子树为空
- TreeNode parentNode = node.parent;
- while (parentNode != null && node == parentNode.rightChild) {
- node = parentNode;
- parentNode = parentNode.parent;
- }
- return parentNode;
- }
- /**
- * precessor: 获取给定结点在中序遍历顺序下的前趋结点
- *
- * @param node
- * 给定树中的结点
- * @return 若该结点存在中序遍历顺序下的前趋结点,则返回其前趋结点;否则返回 null
- * @throws Exception
- */
- public TreeNode precessor(TreeNode node) throws Exception {
- if (node == null ) {
- return null ;
- }
- // 若该结点的左子树不为空,则其前趋结点就是左子树中的最大关键字结点
- if (node.leftChild != null ) {
- return maxElemNode(node.leftChild);
- }
- // 若该结点左子树为空
- TreeNode parentNode = node.parent;
- while (parentNode != null && node == parentNode.leftChild) {
- node = parentNode;
- parentNode = parentNode.parent;
- }
- return parentNode;
- }
- /**
- * insert: 将给定关键字插入到二叉查找树中
- *
- * @param key
- * 给定关键字
- */
- public void insert( int key) {
- TreeNode parentNode = null ;
- TreeNode newNode = new TreeNode(key, null , null , null );
- TreeNode pNode = root;
- if (root == null ) {
- root = newNode;
- return ;
- }
- while (pNode != null ) {
- parentNode = pNode;
- if (key < pNode.key) {
- pNode = pNode.leftChild;
- } else if (key > pNode.key) {
- pNode = pNode.rightChild;
- } else {
- // 树中已存在匹配给定关键字的结点,则什么都不做直接返回
- return ;
- }
- }
- if (key < parentNode.key) {
- parentNode.leftChild = newNode;
- newNode.parent = parentNode;
- } else {
- parentNode.rightChild = newNode;
- newNode.parent = parentNode;
- }
- }
- /**
- * insert: 从二叉查找树中删除匹配给定关键字相应的树结点
- *
- * @param key
- * 给定关键字
- */
- public void delete( int key) throws Exception {
- TreeNode pNode = search(key);
- if (pNode == null ) {
- throw new Exception( "树中不存在要删除的关键字!" );
- }
- delete(pNode);
- }
- /**
- * delete: 从二叉查找树中删除给定的结点.
- *
- * @param pNode
- * 要删除的结点
- *
- * 前置条件: 给定结点在二叉查找树中已经存在
- * @throws Exception
- */
- private void delete(TreeNode pNode) throws Exception {
- if (pNode == null ) {
- return ;
- }
- if (pNode.leftChild == null && pNode.rightChild == null ) { // 该结点既无左孩子结点,也无右孩子结点
- TreeNode parentNode = pNode.parent;
- if (pNode == parentNode.leftChild) {
- parentNode.leftChild = null ;
- } else {
- parentNode.rightChild = null ;
- }
- return ;
- }
- if (pNode.leftChild == null && pNode.rightChild != null ) { // 该结点左孩子结点为空,右孩子结点非空
- TreeNode parentNode = pNode.parent;
- if (pNode == parentNode.leftChild) {
- parentNode.leftChild = pNode.rightChild;
- pNode.rightChild.parent = parentNode;
- } else {
- parentNode.rightChild = pNode.rightChild;
- pNode.rightChild.parent = parentNode;
- }
- return ;
- }
- if (pNode.leftChild != null && pNode.rightChild == null ) { // 该结点左孩子结点非空,右孩子结点为空
- TreeNode parentNode = pNode.parent;
- if (pNode == parentNode.leftChild) {
- parentNode.leftChild = pNode.leftChild;
- pNode.rightChild.parent = parentNode;
- } else {
- parentNode.rightChild = pNode.leftChild;
- pNode.rightChild.parent = parentNode;
- }
- return ;
- }
- // 该结点左右孩子结点均非空,则删除该结点的后继结点,并用该后继结点取代该结点
- TreeNode successorNode = successor(pNode);
- delete(successorNode);
- pNode.key = successorNode.key;
- }
- /**
- * inOrderTraverseList: 获得二叉查找树的中序遍历结点列表
- *
- * @return 二叉查找树的中序遍历结点列表
- */
- public List<TreeNode> inOrderTraverseList() {
- if (nodelist != null ) {
- nodelist.clear();
- }
- inOrderTraverse(root);
- return nodelist;
- }
- /**
- * inOrderTraverse: 对给定二叉查找树进行中序遍历
- *
- * @param root
- * 给定二叉查找树的根结点
- */
- private void inOrderTraverse(TreeNode root) {
- if (root != null ) {
- inOrderTraverse(root.leftChild);
- nodelist.add(root);
- inOrderTraverse(root.rightChild);
- }
- }
- /**
- * toStringOfOrderList: 获取二叉查找树中关键字的有序列表
- *
- * @return 二叉查找树中关键字的有序列表
- */
- public String toStringOfOrderList() {
- StringBuilder sbBuilder = new StringBuilder( " [ " );
- for (TreeNode p : inOrderTraverseList()) {
- sbBuilder.append(p.key);
- sbBuilder.append(" " );
- }
- sbBuilder.append("]" );
- return sbBuilder.toString();
- }
- /**
- * 获取该二叉查找树的字符串表示
- */
- public String toString() {
- StringBuilder sbBuilder = new StringBuilder( " [ " );
- for (TreeNode p : inOrderTraverseList()) {
- sbBuilder.append(p);
- sbBuilder.append(" " );
- }
- sbBuilder.append("]" );
- return sbBuilder.toString();
- }
- public TreeNode getRoot() {
- return root;
- }
- public static void testNode(BinarySearchTree bst, TreeNode pNode)
- throws Exception {
- System.out.println("本结点: " + pNode);
- System.out.println("前趋结点: " + bst.precessor(pNode));
- System.out.println("后继结点: " + bst.successor(pNode));
- }
- public static void testTraverse(BinarySearchTree bst) {
- System.out.println("二叉树遍历:" + bst);
- System.out.println("二叉查找树转换为有序列表: " + bst.toStringOfOrderList());
- }
- public static void main(String[] args) {
- try {
- BinarySearchTree bst = new BinarySearchTree();
- System.out.println("查找树是否为空? " + (bst.isEmpty() ? "是" : "否" ));
- int [] keys = new int [] { 15 , 6 , 18 , 3 , 7 , 13 , 20 , 2 , 9 , 4 };
- for ( int key : keys) {
- bst.insert(key);
- }
- System.out.println("查找树是否为空? " + (bst.isEmpty() ? "是" : "否" ));
- TreeNode minkeyNode = bst.minElemNode(bst.getRoot());
- System.out.println("最小关键字: " + minkeyNode.getKey());
- testNode(bst, minkeyNode);
- TreeNode maxKeyNode = bst.maxElemNode(bst.getRoot());
- System.out.println("最大关键字: " + maxKeyNode.getKey());
- testNode(bst, maxKeyNode);
- System.out.println("根结点关键字: " + bst.getRoot().getKey());
- testNode(bst, bst.getRoot());
- testTraverse(bst);
- System.out.println("****************************** " );
- testTraverse(bst);
- } catch (Exception e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
-
}
发表评论
-
判断二叉树是否平衡及计算二叉树深度和结点个数
2012-09-01 10:12 7716参考:http://blog.csdn.net/zz19880 ... -
二叉树及其遍历
2012-08-21 09:50 1546转自:http://www.iteye.com/t ... -
java栈中缀表达式转为后缀表达式
2012-07-19 11:33 2461思路: 遇到数字,则输出。 遇到操作符,入栈,在入栈前若该 ... -
java栈实现括号匹配
2012-07-19 09:48 4536算法思想: 做一个空栈,读入字符。 若字符是左运算符,则入 ... -
【转】java静态变量和实例变量的区别
2012-06-20 11:02 1336转自:http://www.2cto.com/kf/20100 ... -
【转】java中会存在内存泄漏吗,请简单描述。
2012-06-20 10:24 1381java中 ... -
【转】java匿名内部类2
2012-06-12 13:45 1247匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类? ... -
【转】java匿名内部类
2012-06-12 13:32 1426java匿名内部类 (2010-11 ... -
【转】JAVA中获取路径
2012-03-25 16:57 852转自:http://wenku.baidu.com/view/ ... -
【转】Map遍历
2012-03-25 16:56 939转自:http://wenku.baidu.com/view/ ... -
【转】java解析xml文件四种方式
2012-03-25 16:54 1376转自:http://wenku.baidu.com ... -
【转】JDOM解析处理xml
2012-03-25 16:52 1242转自http://qingbyqing.iteye.com/b ... -
【转】解析Html页面:HTML Parser的试用
2012-03-24 15:10 1398转自:http://blog.csdn.net/scud/ar ... -
【转】java随机排列数组
2012-02-20 18:58 2362转自:http://blog.csdn.net/liang ... -
设计模式——代理模式
2012-01-06 13:14 1267代理模式: 为其他对象提供一种代理以控制对这个对象的访问 ... -
设计模式——装饰模式
2012-01-05 15:58 1271首先介绍三个重要原则: 依赖倒转原则:高层模块不应该依赖于 ... -
设计模式——策略模式 & 单例模式
2011-12-29 16:26 1552策略模式: * 策略模式定义了算法家族,分别封装起来,让他 ... -
排序算法
2011-12-28 22:41 945参考:http://student.zjzk.cn/cours ... -
设计模式——简单工厂 VS 工厂方法
2011-12-28 15:07 1184简单工厂模式: 它最大优点在于工厂类中包含了必要的逻辑 ... -
String
2011-12-27 10:53 12681. String s = new String(" ...
相关推荐
在Java中实现二叉排序树,我们通常会定义一个`Node`类来表示树的节点,它包含键、值以及左右子节点的引用。例如: ```java class Node { int key; Object value; Node left, right; public Node(int item) { ...
二叉查找树的实现。包括树的平衡以及树节点的删除。以及树的广度优先遍历,深度优先遍历。
二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。在二叉排序树中,每个节点都包含一个键值,对于任意节点,其左子树中的所有节点的键值小于该节点的键值,而...
C、C++和Java实现二叉查找树时,通常会定义一个结构体(或类)来表示树节点,包括键值、指向左右子节点的指针以及可能的额外信息。对于C++和Java,还可以使用面向对象的方式,定义一个类来封装插入、查找和删除的...
以上就是关于二叉查找树在Java中的基本实现,包括插入、删除、遍历和查询等操作。通过这些操作,我们可以高效地管理一组有序数据,并进行各种数据操作。二叉查找树在实际应用中广泛用于数据库索引、文件系统以及各种...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在处理搜索、插入和删除操作时具有较高的效率,尤其对于有序数据。在二叉排序树中,每个节点的左子树只包含...
本文主要介绍了Java基于二叉查找树实现排序功能的示例,通过实例形式分析了Java二叉查找树的定义、遍历及排序等相关操作技巧。下面将对这些知识点进行详细的解释和分析。 一、Java二叉查找树的定义 Java二叉查找树...
java实现二叉搜索树,包括插入和查找等基本功能
如果是源代码,它可能用C++、Java或Python等编程语言编写,展示了二叉查找树的插入、删除和查找等基本操作的算法实现。如果是数据文件,它可能存储了预构建的二叉查找树,用户可以直接在程序中查看和操作这个树。 ...
总的来说,`BiSortTreeGui.java`文件通过Java Swing库实现了二叉排序树的数据结构,并结合GUI,使得用户可以直观地进行数据的插入、查找和删除操作,这在教学或实践数据结构时非常有帮助。这个项目展示了如何将抽象...
二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。二叉排序树的主要特点是:对于任意节点,其左子树中的所有...
这段代码展示了构建一个基本的二叉搜索树(Binary Search Tree, BST)的实现。二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种数据结构在查找、...
10. **algorithm**:可能是一个包含各种算法实现的文件夹,如二叉排序树和平衡二叉树的插入、查找和删除算法。 通过这个课程设计,学生将深入理解二叉排序树和平衡二叉树的概念,以及它们在实际问题中的应用,同时...
二叉搜索树的效率: 树的大部分操作需要从上至下一层层的查找树的节点,对于一棵满树,大约有一半的节点处于最底层(最底层节点数 = 其它层节点数的和 + 1),故节点操作大约有一半需要找到最底层节点,大约有四分...
本项目涵盖了三种重要的树形数据结构的Java实现:红黑树(RBTree)、二叉平衡树(AVLTree)以及二叉排序树(BSTree)。这些数据结构在处理大量数据时,能够提供高效的插入、删除和查找操作,广泛应用于数据库索引、...
"java二叉查找树的实现代码" 本文主要介绍了java二叉查找树的实现代码,具有一定的参考价值。下面是对标题、描述、标签和部分内容的详细解释和知识点总结。 一、标题和描述 标题中提到了java二叉查找树的实现代码...
在iOS编程中,实现二叉排序树的增删改查操作是数据结构和算法的重要应用。CodeBlocks是一款跨平台的C++集成开发环境,虽然通常用于Windows,但它同样支持创建和调试Objective-C代码,这是iOS开发的主要语言。 ### ...
以上就是关于Java实现二叉排序树的基本介绍,具体实现可以参考提供的`BinarySortTree.java`文件。在实际应用中,二叉排序树常用于构建索引结构、数据库系统等场景,其高效的查询能力使其成为数据存储和检索的重要...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。在Java中,我们可以利用面向对象编程的概念来实现二叉排序树...