- 浏览: 604258 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
//二叉搜索树 public class BinarySearchTree<T extends Comparable<? super T>> { /** * 构造一棵空树. */ public BinarySearchTree( ) { root = null; } /** * 在二叉搜索树中插入数据. * @param x the item to insert. */ public void insert( T x ) { root = insert( x, root ); } /** * 从二叉搜索中删除数据(节点). * @param x the item to remove. */ public void remove( T x ) { root = remove( x, root ); } /** * 找最小数据. * @return smallest item or null if empty. */ public T findMin( ) { if( isEmpty( ) ) throw new UnderflowException( ); return findMin( root ).element; } /** * 找最大数据. * @return the largest item of null if empty. */ public T findMax( ) { if( isEmpty( ) ) throw new UnderflowException( ); return findMax( root ).element; } //二叉搜索树中是否包含x public boolean contains( T x ) { return contains( x, root ); } public void makeEmpty( ) { root = null; } public boolean isEmpty( ) { return root == null; } //中序遍历输出二叉搜索树的内容 public void printTree( ) { if( isEmpty( ) ) System.out.println( "Empty tree" ); else printTree( root ); } //插入 private BinaryNode<T> insert( T x, BinaryNode<T> t ) { if( t == null ) return new BinaryNode<T>( x, null, null ); int compareResult = x.compareTo( t.element ); if( compareResult < 0 ) t.left = insert( x, t.left ); else if( compareResult > 0 ) t.right = insert( x, t.right ); else ; // Duplicate; do nothing return t; }
删除节点是最难的操作了。如果节点是一片树叶,那么它可以立即删除,将原来指向这个节点的引用设为null。如果节点有一个儿子,则该节点可以在其父节点调整自己的链以绕过该节点后被删除。
//删除 private BinaryNode<T> remove( T x, BinaryNode<T> t ) { //先在树中查找x if( t == null ) return t; // 没有找到,返回 int compareResult = x.compareTo( t.element ); // 在左树中找 if( compareResult < 0 ) t.left = remove( x, t.left ); //在右树中找 else if( compareResult > 0 ) t.right = remove( x, t.right ); //在树中找到了节点值为x的节点 else if( t.left != null && t.right != null ) // 这个节点有两个孩子节点 { t.element = findMin( t.right ).element; t.right = remove( t.element, t.right ); } else//这个节点只有一个孩子节点或没有孩子节点 t = ( t.left != null ) ? t.left : t.right; return t; } //在二叉搜索树中找最小值节点 private BinaryNode<T> findMin( BinaryNode<T> t ) { if( t == null ) return null; else if( t.left == null ) return t; return findMin( t.left ); } //在二叉搜索树中找最大值节点 private BinaryNode<T> findMax( BinaryNode<T> t ) { if( t != null ) while( t.right != null ) t = t.right; return t; } //是否包含 private boolean contains( T x, BinaryNode<T> t ) { if( t == null ) return false; int compareResult = x.compareTo( t.element ); if( compareResult < 0 ) return contains( x, t.left ); else if( compareResult > 0 ) return contains( x, t.right ); else return true; // Match } //中序遍历二叉树 private void printTree( BinaryNode<T> t ) { if( t != null ) { printTree( t.left ); System.out.print(t.element+" "); printTree( t.right ); } } // 二叉搜索树节点类 private static class BinaryNode<T> { // Constructors BinaryNode( T theElement ) { this( theElement, null, null ); } BinaryNode( T theElement, BinaryNode<T> lt, BinaryNode<T> rt ) { element = theElement; left = lt; right = rt; } T element; // The data in the node BinaryNode<T> left; // Left child BinaryNode<T> right; // Right child } /** 二叉搜索树的根 */ private BinaryNode<T> root; // 测试 public static void main( String [ ] args ) { BinarySearchTree<Integer> t = new BinarySearchTree<Integer>( ); final int NUMS = 100; final int GAP = 37; System.out.println( "Checking... (no more output means success)" ); for( int i = GAP; i != 0; i = ( i + GAP ) % NUMS ) t.insert( i ); t.printTree( ); System.out.printf("\n\n"); for( int i = 1; i < NUMS; i+= 2 ) t.remove( i ); t.printTree( ); System.out.println(); if( t.findMin( ) != 2 || t.findMax( ) != NUMS - 2 ) System.out.println( "FindMin or FindMax error!" ); for( int i = 2; i < NUMS; i+=2 ) if( !t.contains( i ) ) System.out.println( "Find error1!" ); for( int i = 1; i < NUMS; i+=2 ) { if( t.contains( i ) ) System.out.println( "Find error2!" ); } } }
下载源码:
发表评论
-
求二叉树上任意两个节点的最近公共父节点
2013-01-09 10:24 2404北大百练题2756: 如上图所示,由正整数1, 2 ... -
JAVA判断二叉树是否是二叉平衡树
2013-01-07 18:59 1988import java.util.*; ... -
大顶堆应用:POJ2010
2012-12-23 20:59 1912POJ2010题意: 奶牛学校招生,c头奶牛报名,要选 ... -
二维树状数组学习之二:练习POJ 1195
2012-12-12 21:40 1400接前文:二维树状数组学习之一:彻底理解http://128kj ... -
二维树状数组学习之一:彻底理解
2012-12-12 20:54 2472当要频繁的对数组元素进行修改,同时又要频繁的查询数组内 ... -
图的深搜+树状数组练习 POJ 3321(JAVA)
2012-12-11 11:13 1843关于树状数组:参看:http://128kj.iteye.co ... -
树状数组练习:POJ 3067
2012-12-09 17:10 1845关于树状数组,参看:http://128kj.iteye.co ... -
树状数组练习:POJ 2481(JAVA)
2012-12-08 18:11 1823关于树状数组,请参考:http://128kj.iteye.c ... -
初步了解树状数组
2012-12-07 14:18 1791一、树状数组是干什么的? 平常我们会遇到一些对数组进 ... -
线段树求逆序数(离散化)POJ 2299
2012-12-06 08:25 2122POJ2299题意: 给出长度为n的序列,每次只能交换 ... -
利用线段树求逆序数(JAVA)
2012-12-04 22:46 2597设A[1…n]是一个包含n个不同数的数组。如果在i< ... -
线段树入门学习(三)懒操作(兼解POJ1823) JAVA
2012-12-02 15:37 2139继续上文"线段树入门学习(二)" ht ... -
线段树入门学习(二)(兼解POJ3468) JAVA
2012-11-30 16:55 2561继续上文http://128kj.iteye. ... -
线段树入门学习(兼解HDU1754)
2012-11-30 11:24 2729先看网上的介绍: 线段树也叫区间树,顾名思义,线段树是 ... -
AVL树及JAVA实现
2012-11-26 16:34 2307一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二 ... -
图解平衡二叉树
2012-11-26 11:34 2064形态匀称的二叉树 ... -
深度优先遍历字典树(统计单词出现的个数)
2012-11-23 22:18 2856例:给出一个字符文本,每行一个字符串,统计不同的字符串出现的百 ... -
学习使用字典树(JAVA)
2012-11-22 09:25 2148字典树 又称单词 ... -
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
2012-11-17 21:50 18735堆有最大堆和最小堆之分,最大堆就是每个节点的值都>= ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4070一、什么是并查集 ...
相关推荐
在C++中实现二叉查找树,我们需要定义一个结构体或类来表示树节点,包括节点的值、指向左子节点和右子节点的指针。以下是一个简单的C++实现框架: ```cpp struct TreeNode { int val; TreeNode* left; TreeNode*...
`TreeH.h`很可能是头文件,包含了二叉查找树模板类的定义,而`TreeD.cpp`则可能包含了该类的实现以及相关的测试用例。 在`TreeH.h`中,我们可能会看到一个名为`BinarySearchTree`的模板类,它的模板参数可以是任何...
在"二叉查找树实现简单的信息检索"中,我们关注的是如何利用二叉查找树来高效地检索信息。首先,我们需要创建一个二叉查找树的数据结构。在提供的文件中,`Binary_tree.h`和`Binary_tree.cpp`很可能是定义和实现这个...
1、 定义二叉查找树的类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)实现二叉查找树结构; 2) 实现二叉查找树的查找、插入和删除等算法;
在C++中实现二叉查找树,一般会定义一个结构体或类来表示树节点,包括键、值和子节点指针。然后,提供一系列成员函数来执行基本操作,如`insert`(插入)、`search`(查找)、`delete`(删除)。以下是C++实现二叉...
实现`findwords`函数时,首先需要将文件中的单词提取出来,并且用二叉查找树进行存储。在C语言中,我们可以创建一个结构体来表示树节点,包括单词(key)和指向左右子节点的指针。初始化树时,可以创建一个空节点...
通过上述代码解析,我们了解了二叉查找树的基本概念、插入及遍历操作的具体实现过程。这种数据结构因其高效的操作性能,在实际应用中非常常见。理解二叉查找树的原理对于掌握更高级的数据结构如AVL树、红黑树等也是...
用C++实现的最优二叉查找树,简单,明了,是数据结构里经典必学算法,初学者适用
在C语言中实现二叉查找树,我们需要定义一个结构体来表示树的节点,通常包括键、值以及指向左右子节点的指针。下面是一个简单的二叉查找树节点结构体定义: ```c typedef struct TreeNode { int key; void* value...
标题:最优二叉查找树 描述:算法对最优二叉树的实现(课本上对最优二叉树的基本实现) 在计算机科学中,最优二叉查找树(Optimal Binary Search Tree,简称OBST)是一种特殊的二叉查找树,其设计目标是在平均情况...
最近在研究数据结构这本书,自己动手实现的一个二叉查找排序树的类BinSortTree,实现数据的插入,查找,删除,层序遍历,中序遍历等操作,熟悉数据结构的朋友都知道,根据二叉排序树的定义,中序遍历后得到的序列...
二叉查找树的实现。包括树的平衡以及树节点的删除。以及树的广度优先遍历,深度优先遍历。
在C语言中实现二叉查找树,我们需要定义一个结构体来表示树节点,包含节点的值以及指向左右子节点的指针。例如: ```c typedef struct Node { int data; struct Node* left; struct Node* right; } Node; ``` ...
这是一个二叉查找树,实现了以下操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继。上述所有操作时间复杂度均为o(h),其中h是树的高度 注释很详细,具体内容就看...
### 二叉查找树的C++实现 #### 一、二叉查找树简介 二叉查找树(Binary Search Tree),也称作有序或排序二叉树,是一种特殊的二叉树数据结构,其每个节点包含一个键(key)和两个指针(指向左子树和右子树)。对于...
C++实现二叉查找树时,通常会定义一个结构体或类来表示树的节点,包括键值、左右子节点的指针。例如: ```cpp struct TreeNode { int key; TreeNode* left; TreeNode* right; }; ``` 在C++中,二叉查找树的基本...
总之,这个C++课程作业通过动态规划法实现了最优二叉查找树的构建,旨在提高搜索效率。通过分析和理解代码,你可以深入学习动态规划的应用以及二叉查找树的优化策略。对于学习数据结构和算法的学生来说,这是一个很...