费了好大的功夫,写了一棵二叉搜索树,还真是不容易。如果在写一遍,估计还会放蒙会。
难点主要在删除那个地方,有点麻烦,考虑的比较多。
以下是代码:
//定义节点类
public class BinaryNode<E> {
private E item;
private BinaryNode<E> left;
private BinaryNode<E> right;
public BinaryNode(E item) {
this.item = item;
}
public E getItem() {
return item;
}
public void setItem(E item) {
this.item = item;
}
public BinaryNode<E> getLeft() {
return left;
}
public void setLeft(BinaryNode<E> left) {
this.left = left;
}
public BinaryNode<E> getRight() {
return right;
}
public void setRight(BinaryNode<E> right) {
this.right = right;
}
//设置节点的左右节点
public void setChild(int comparition,BinaryNode<E> target){
if(comparition<0){
this.setLeft(target);
}
else{
this.setRight(target);
}
}
//前序遍力
public String toStringPreorder(){
String result="";
result=result+getItem()+",";
if(getLeft()!=null){
result=result+getLeft().toStringPreorder();
}
if(getRight()!=null){
result=result+getRight().toStringPreorder();
}
return result;
}
//中续遍历
public String toStringInorder(){
String result="";
if(getLeft()!=null){
result=result+getLeft().toStringInorder();
}
result=result+getItem()+",";
if(getRight()!=null){
result=result+getRight().toStringInorder();
}
return result;
}
//后序遍历
public String toStringPostorder(){
String result="";
if(getLeft()!=null){
result=result+getLeft().toStringPostorder();
}
if(getRight()!=null){
result=result+getRight().toStringPostorder();
}
result=result+getItem()+",";
return result;
}
}
//二叉搜索树类
public class BinarySearchTree<E extends Comparable<E>> {
private BinaryNode<E> root;
//计算树的节点
public int size() {
return sizeHelper(root);
}
private int sizeHelper(BinaryNode<E> node) {
if (node == null) {
return 0;
} else {
//运用递归计算左子树的个数加上右子数的个数 加上本身
return 1 + sizeHelper(node.getLeft()) + sizeHelper(node.getRight());
}
}
public boolean contain(E target) {
BinaryNode<E> node = root;
while (node != null) {
int comparition = target.compareTo(node.getItem());
//目标较大应该往右寻找
if (comparition > 0) {
node = node.getRight();
}
//找到了
if (comparition == 0) {
return true;
}
//目标较小应该往左寻找
if (comparition < 0) {
node = node.getLeft();
}
}
return false;
}
public void add(E target) {
//如果为空树建一个
if (root == null) {
BinaryNode<E> node = new BinaryNode<E>(target);
root = node;
} else {
BinaryNode<E> node = root;
BinaryNode<E> parent = null; //用来指向目标节点的父亲
int comparition = 0;//记录目标节点是在其父亲的左边,还是右边
//循环用于找到目标节点应该放在哪里
while (node != null) {
comparition = target.compareTo(node.getItem());
if (comparition > 0) {
parent = node;
node = node.getRight();
}
//如果存在,不做任何操作
if (comparition == 0) {
return;
}
if (comparition < 0) {
parent = node;
node = node.getLeft();
}
}
//往父亲节点上加入目标节点
parent.setChild(comparition, new BinaryNode<E>(target));
}
}
public void remove(E target) {
if (root == null) {
return;
} else {
BinaryNode<E> node = root;
BinaryNode<E> parent = null;
int comparition = 0;
int direction=0;//记录目标节点是在其父亲的左边,还是右边
while (node != null) {
comparition = target.compareTo(node.getItem());
//寻找目标元素在哪里,大的话往右找
if (comparition > 0) {
parent = node;
node = node.getRight();
direction=comparition;
}
//当找到这个目标元素后以下分为三种情况
if (comparition == 0) {
//如果目标元素的左子树为空那么直接让目标父节点根据direction指向右树
if(node.getLeft()==null){
parent.setChild(direction,node.getRight());
}
//同上
else if(node.getRight()==null){
parent.setChild(direction,node.getLeft());
}//叶子节点将适应以上两种情况 所以无须特殊处理
else{
//如果删除的目标含两左右树,那么不能让目标父节点直接指向它们
//因为删除目标后剩下两棵左右,而目标父节点无法指向两个
//为了解决这个问题,并仍然满足二叉搜索树,我们将找出一个元素来替代目标元素
//以下是找出目标节点的右子树中最小的元素,它在最最左边
//因为它比目标元素的左子树的元素都大,而且比目标元素的右子树其他都小
//用这个元素替代目标元素将使的原来的树仍然符合二叉树
//temp将是这个找出的节点 它初始指向目标
BinaryNode<E> temp=node;
BinaryNode<E> tempparent=parent;
temp=temp.getRight();
while(temp.getLeft()!=null){
tempparent=temp;
temp=temp.getLeft();
}
//让找出的节点的父节点指向找出节点的右子树(因为找出的节点是在左,所以一定是指向右)
//相当取出找出的节点
tempparent.setLeft(temp.getRight());
//原来的目标节点替换上找出的节点
node.setItem(temp.getItem());
}
return;
}
//小的话往左找
if (comparition < 0) {
parent = node;
node = node.getLeft();
direction=comparition;
}
}
}
}
public String toString() {
//中序遍历 将成为升序
return root.toStringInorder();
}
}
分享到:
相关推荐
《基于二叉搜索树实现的电话簿程序》 在计算机科学中,数据结构是存储和组织数据的关键方式,而二叉搜索树(Binary Search Tree,BST)作为一种特殊的数据结构,因其高效的操作性能在各种实际应用中得到广泛使用。...
使用二叉链表和c++来实现二叉搜索树,提供插入、删除、遍历、求最小节点、最大最节点等操作。
二叉搜索树(Binary ...总之,这个压缩包提供了一个完整的二叉搜索树实现,包括基本操作和相应的数据结构。学习和理解这些代码可以帮助开发者深入掌握数据结构和算法,特别是在C++环境下如何高效地操作二叉搜索树。
使用C++的二叉搜索树实现学生成绩管理系统,代码内包含完整的系统
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,它的每个节点都具有以下特性:左子树上所有节点的值均小于当前节点的值,右子树上所有节点的值均大于当前节点的值。这种特性使得二叉搜索树在查找、...
最优二叉搜索树的实现通常涉及递归或迭代的过程,通过计算和比较不同分割点的代价来确定最佳结构。在给定的压缩包文件中,可能包含了实现这一算法的源代码和可执行文件,你可以通过查看这些文件来深入理解算法的具体...
`bstree.cpp`和`bstree.h`这两个文件很可能是实现二叉搜索树插入和删除操作的源代码。在C++中,通常我们会定义一个名为`BSTNode`的结构体或类来表示树的节点,它包括键、值以及左右子节点的指针。接下来,我们可能会...
下面我们将详细探讨如何利用二叉搜索树实现这些功能。 **插入联系人信息:** 当插入一个新联系人时,我们根据其姓名(通常作为键值)与树中现有节点进行比较。如果新姓名小于当前节点的姓名,我们向左子树递归;...
1.实现二叉搜索树的基本操作 2.包括建立,查找,删除,显示 3.得到最长路径和最短路径,并能分别计算长度
从给定的文件信息来看,该段代码主要涉及到了数据结构中的两个重要概念:霍夫曼树(Huffman Tree)和二叉搜索树(Binary Search Tree),并使用C++语言进行实现。以下是对这两个知识点的详细解析: ### 霍夫曼树...
总的来说,这段二叉搜索树的源码提供了一个完整的二叉搜索树实现,包括基本操作如插入、查找、删除以及三种遍历方式。通过模板类的设计,它可以用于存储任何满足比较运算符的类型,如整型、浮点型或自定义对象。这个...
在这两个PPT中,我们将会深入探讨二叉搜索树的定义、性质、操作以及相关的算法实现。 一、二叉搜索树的定义与性质 1. 定义:二叉搜索树的每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个...
二叉搜索树(Binary Search Tree, BST)是一种特殊类型的数据结构,它的每个节点最多有两个子节点,左子节点的值总是小于当前节点,而右子节点的值总是大于当前节点。这种特性使得二叉搜索树在查找、插入和删除操作...
本压缩包“acm二叉搜索树参考代码”可能包含了几种不同的二叉搜索树操作的实现,如插入、删除、查找等,以及用于测试这些操作的测试数据。 1. 插入操作:在二叉搜索树中插入一个新节点,首先需要比较新节点的键值与...
给定的代码片段是C++实现的一个基本的增强二叉搜索树,包括创建、插入、删除、前序遍历、中序遍历、后序遍历、复制、计算高度以及比较两个子树的方法。下面我们将详细解释这些方法: 1. **Newtree**: 这个函数初始...
二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树...通过分析和理解“二叉搜索树.c”的源代码,我们可以深入学习二叉搜索树的原理和实现细节,这对于学习数据结构和算法以及进行软件开发都是非常有价值的。
`BST.java`很可能是二叉搜索树的实现,`TreeDoc.java`可能包含了关于数据结构或树操作的文档,而`BSTMain.java`应该是主程序,用于测试和展示二叉搜索树的功能。 在`BST.java`中,二叉搜索树的节点可能包含以下属性...
总结起来,"二叉搜索树统计单词频率 MFC实现"涉及的技术点包括: 1. 二叉搜索树的插入操作和中序遍历 2. C++字符串处理和单词提取 3. MFC框架下的GUI编程,包括对话框、控件和事件处理 4. 用户交互设计,如输入输出...
在提供的压缩包文件"二叉搜索树"中,很可能包含了实现上述功能的C++源代码,你可以通过查看源代码学习具体实现细节,如节点结构的定义、插入、删除和查找函数的编写等。通过理解和实践这些代码,可以加深对二叉搜索...
# 最优二叉搜索树(OBST)模范讲解 ## OBST的概念与构造 ### 定义 **最优二叉搜索树**(Optimal Binary Search Tree,...通过动态规划等算法可以有效地解决构建最优二叉搜索树的问题,从而实现高效的数据查找和管理。