package com.sort;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
public class SortedBinTree<T extends Comparable> {
static class Node {
Object data;
Node parent;
Node left;
Node right;
public Node(Object data, Node parent, Node left, Node right) {
this.data = data;
this.parent = parent;
this.left = left;
this.right = right;
}
public String toString() {
return "[data=" + data + "]";
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj.getClass() == Node.class) {
Node target = (Node) obj;
return data.equals(target.data) && left == target.left
&& right == target.right && parent ==
target.parent;
}
return false;
}
}
private Node root;
//构造器用于创建二叉树
public SortedBinTree(){
root=null;
}
public SortedBinTree(T o){
root=new Node(o, null, null, null);
}
//添加节点
public void add(T ele){
//如果根节点为null
if(root==null){
root=new Node(ele, null, null, null);
}else{
Node current=root;
Node parent=null;
int cmp=0;
//搜索合适的叶子节点,以该节点为父子节点添加新节点
do{
parent=current;
cmp=ele.compareTo(current.data);
//如果新节点的值大于当前节点值
if(cmp>0){
//以右子节点作为当前节点
current=current.right;
}else{
//如果新节点值小于当前节点值
//以左节点作为当前节点
current=current.left;
}
}while(current!=null);
//创建新节点
Node newNode=new Node(ele, parent, null, null);
//如果新节点的值大于父节点的值
if(cmp>0){
//新节点作为父节点的右子节点
parent.right=newNode;
}else{
//新节点的值小于父节点的值
//新节点作为父节点的左子节点
parent.left=newNode;
}
}
}
//删除节点
public void remove(T ele){
//获取要删除的节点
Node target=getNode(ele);
if(target==null){
return;
}
//左右子树为空
if(target.left==null&&target.right==null){
//被删除的节点是跟节点
if(target==root){
root=null;
}else{
//被删除节点是父节点的左子节点
if(target==target.parent.left){
//将target的父节点的left设为null
target.parent.left=null;
}else{
//将target的父节点的right设为null
target.parent.right=null;
}
target.parent=null;
}
}else if(target.left==null&&target.right!=null){ //左子树为空,右子树不为空
//被删除节点是跟节点
if(target==root){
root=target.right;
}else{
//被删除节点是父节点的左子节点
if(target==target.parent.left){
//让target的父节点的left指向target的右子树
target.parent.left=target.right;
}else{
//让target的父节点的right指向target的右子树
target.parent.right=target.right;
}
//让target的右子树的parent指向target的parent
target.right.parent=target.parent;
}
}else if(target.left!=null&&target.right==null){ //左子树不为空,右子树为空
//被删除的是跟节点
if(target==root){
root=target.left;
}else{
//被删除的节点是父节点的左子节点
if(target==target.parent.left){
//让target的父节点的left指向target的左子树
target.parent.left=target.left;
}else{
//让target的父节点的right指向target的左子树
target.parent.right=target.left;
}
}
}else{ //左右子树都不为空
//leftMaxNode用于保存target节点的左子树中值最大的节点
Node leftMaxNode=target.left;
//搜索target节点的左子树中值最大的节点
while(leftMaxNode.right!=null){
leftMaxNode=leftMaxNode.right;
}
//从原来的子树中删除leftMaxNod
leftMaxNode.parent.right=null;
//让leftMaxNode的parent指向target的parent
leftMaxNode.parent=target.parent;
//被删除节点是父节点的左子节点
if(target==target.parent.left){
//让target的父节点的left指向leftMaxNode
target.parent.left=leftMaxNode;
}else{
//让target的父节点的right指向leftMaxNode
target.parent.right=leftMaxNode;
}
leftMaxNode.left=target.left;
leftMaxNode.right=target.right;
target.parent=target.left=target.right=null;
}
}
//给指定的值搜索节点
public Node getNode(T ele){
//从根节点开始搜索
Node p=root;
while(p!=null){
int cmp=ele.compareTo(p.data);
//如果搜索的值小于当前p节点的值
if(cmp<0){
//向左子树搜索
p=p.left;
}else if(cmp>0){ //如果搜索的值大于当前p节点的值
p=p.right;
}else{
return p;
}
}
return null;
}
//广度优先遍历
public List<Node> breadthFirst(){
Queue<Node> queue=new ArrayDeque<Node>();
List<Node> list=new ArrayList<Node>();
if(root!=null){
//将根元素加入"队列"
queue.offer(root);
}
while(!queue.isEmpty()){
//将该队列的"队尾"的元素添加到List中
list.add(queue.peek());
Node p=queue.poll();
//如果左子节点不为null,将它加入"队列"
if(p.left!=null){
queue.offer(p.left);
}
//如果右子节点不为null,将它加入"队列"
if(p.right!=null){
queue.offer(p.right);
}
}
return list;
}
}
分享到:
相关推荐
二叉排序树是一种特殊的二叉树,它的每个结点的关键字都大于左子树的关键字,小于右子树的关键字。因此,在插入新的数据元素时,需要确保树的结构仍然满足二叉排序树的性质。 插入算法的步骤可以分为三步: 1. ...
2. **插入操作**:向二叉排序树中插入一个新的元素。这个过程涉及找到合适的位置将新节点插入,以保持树的性质。如果新节点的值小于当前节点,那么就递归地在左子树中插入;如果新节点的值大于当前节点,则在右子树...
### 数据结构——二叉排序树算法 #### 1. 插入新节点 二叉排序树(Binary Search Tree, BST),也称为二叉查找树或者二叉搜索树,是一种特殊的二叉树,其中每个节点的左子树只包含键值小于该节点的节点;右子树只...
### C++中的二叉排序树算法详解 #### 引言 在计算机科学中,二叉排序树(Binary Search Tree,简称BST)是一种重要的数据结构,它不仅能够高效地存储数据,还能快速查找、插入和删除节点。二叉排序树的特点在于每...
掌握二叉排序树的存储方法,实现二叉排序树的创建、查找、插入、删除、平均查找长度等基本操作。 三、实验内容及要求 1、构造二叉排序树的存储结构。 2、实现创建、查找、插入、删除、平均查找长度等操作。
对于一个理想的平衡二叉排序树,所有操作的时间复杂度可以达到O(log n)。 在描述中提到,我们需要以回车('\n')为输入结束标志,输入一系列数字来构建二叉排序树。这个过程可以通过以下步骤实现: 1. 初始化一个空...
第一个程序:实现将两个二叉排序树合并为一个二叉排序树的算法; 第二个程序:N个人围成一圈,从第一个人开始计数,凡是数到1,2,4,8,也就是2的N次方的退出圈子。编写程序,把这些人退出的顺序输出,要求用链表。
如果关键字不存在于树中,我们可以将它作为一个新节点插入到正确位置,保持二叉排序树的性质。插入操作同样遵循上述的插入规则,即根据关键字与当前节点的比较结果决定插入位置。 在实现这些操作时,我们通常使用...
在讨论具体算法之前,我们需要明确二叉排序树的基本概念及其性质。二叉排序树是一种非常重要的数据结构,在实际应用中有着广泛的应用场景,比如用于实现高效的查找、插入和删除操作。 #### 性质概述 - **左小右大**...
在大学的计算机科学课程中,数据结构是重要的学习内容,二叉排序树是其中的一个关键概念。学习如何设计和实现二叉排序树可以帮助学生理解和掌握动态数据结构的操作,并为算法分析和复杂度计算打下基础。 在C语言中...
二叉排序树,又称二叉查找树或...通过这个实现,你可以构建和操作一个基于二叉链式结构的二叉排序树,有效地执行插入和查找操作。在实际应用中,二叉排序树常用于数据库索引、文件系统等场景,以快速定位和检索数据。
本文通过具体的C语言代码示例详细介绍了如何实现二叉排序树的生成算法,并重点探讨了如何构建一个平衡的二叉排序树。通过右旋、左旋以及平衡处理等操作,我们可以有效地保持二叉排序树的平衡性,进而提高查找、插入...
代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法
通过阅读和分析这些代码,我们可以更深入地理解二叉排序树的内部机制,掌握数据结构和算法在实际编程中的应用。 总的来说,二叉排序树是一种实用的数据结构,广泛应用于各种需要高效查找和排序的场景,例如数据库...
在二叉排序树中,对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种特性使得二叉排序树非常适合于快速查找、插入和删除操作。 在C++中实现二叉排序树...
在C++中实现二叉排序树查找算法,通常涉及以下几个关键步骤: 1. **定义节点结构体**: 首先,我们需要定义一个表示二叉树节点的结构体,包含一个整数值和两个指向子节点的指针。 ```cpp struct TreeNode { int ...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和检索数据,以优化...这个实验报告提供了一个实用的框架,可以帮助其他学生理解和实现二叉排序树的各种操作,进一步巩固他们在数据结构课程中的学习成果。
在二叉排序树中插入一个新节点,首先需要找到合适的位置。从根节点开始,如果新节点的键小于当前节点的键,则向左子树递归,反之则向右子树递归。当找到一个叶子节点(没有子节点的节点)时,新节点就插入到这个位置...
**二叉排序树问题**是数据结构课程设计中常见的一个课题,旨在让学生深入理解并实践二叉树、查找表的逻辑结构和存储结构。在这个任务中,学生需要设计一个程序来实现二叉排序树的基本操作,同时提升自身的编程能力和...