创建排序二叉树的步骤:

1、以根节点为当前节点开始搜索

2、拿新节点的值和当前节点的值比较

3、如果新节点的值更大,则以当前结点的右子节点作为新的当前节点;如果新节点的值更小,则以当前节点的左子节点作为新的当前节点

4、重复2、3两个步骤,直到搜索到合适的叶子节点

5、将新节点添加为第4步找到的叶子节点的子节点,如果新节点更大,则添加为右子节点;否则添加为左子节点。

删除排序二叉树的一个节点可分为以下几种情况:

1、被删除的节点是叶子节点,只需将它从父节点中删除。

2、被删除节点P只有左子树,将P的左子树PL添加成P的父节点的左子树即可;被删除节点P只有右子树,将P的右子树PR添加成P的父节点的右子树即可;

3、如被删除节点P的左右子树均不为空,则有以下两种做法:

】将PL设为P的父节点Q的左或右子节点(取决于P是其父节点Q的左或右子节点),将PR设为P节点的中序前驱节点S的右子节点(S是PL最右下的节点,也就是PL子树中最大的节点)。

】以P节点的中序前驱或后继代替P所指节点,然后再从原排序二叉树中删去中序前驱或后继节点。(也就是,用大于P的最小节点或小于P的最大节点代替P节点)。

示例代码如下:
import java.util.ArrayList;
import java.util.List;
/**
* 排序2叉树
*
* @author LYYL
*
* @param */
public class SortedBinTree{
public 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 object){
if(this == object){
return true;
}
if(object instanceof Node){
Node target = (Node)object;
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 element){
//如果根节点为空
if(root == null){
root = new Node(element, null, null, null);
}else{
Node current = root;
Node parent = null;
int cmp = 0;
do{
parent = current;
cmp = element.compareTo(parent.data);
if(cmp > 0){
//以右子节点作为当前节点
current = current.right;
}else{
current = current.left;
}
}while(current != null);
Node newNode = new Node(element, parent, null, null);
if(cmp > 0){
parent.right = newNode;
}else{
parent.left = newNode;
}
}
}
//删除节点
public void remove(T element){
//获取要删除的节点:
Node target = getNode(element);
if(target == null){
return;
}
//被删除节点既没有左节点又没有右节点
if(target.left == null && target.right == null){
//如果被删除的节点就是根节点
if(target == root){
root = null;
}else{
//被删除节点是父节点的左节点
if(target == target.parent.left){
target.parent.left = null;
}else{
//被删除节点是父节点的右节点
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.parent.left = target.right;
}else{
//被删除节点是父节点的右节点
target.parent.right = target.right;
}
}
target.right.parent = target.parent;
//很多书上没有下面两条语句,但我认为如果不加这两句将会造成内存泄露
target.right = null;
target.parent = null;
}
//被删除节点左子树不为空,右子树为空
else if(target.left != null && target.right == null){
if(target == root){
root = target.left;
}else{
//被删除节点是父节点的左节点
if(target == target.parent.left){
target.parent.left = target.left;
}else{
//被删除节点是父节点的右节点
target.parent.right = target.left;
}
}
target.left.parent = target.parent;
//很多书上没有下面两条语句,但我认为如果不加这两句将会造成内存泄露
target.left = null;
target.parent = null;
}
else{
//左右子树均不为空,采用中序遍历的前驱节点替代目标节点
Node maxLeftNode = target.left;
//找到目标节点的前驱节点
while(maxLeftNode.right != null){
maxLeftNode = maxLeftNode.right;
}
//从原来的子树中删除maxLeftNode节点
maxLeftNode.parent.right = null;
//让maxLeftNode的父节点指向target的父节点
maxLeftNode.parent = target.parent;
if(target == target.parent.left){
//如果target的为父节点的左节点
target.parent.left = maxLeftNode;
}else{
target.parent.right = maxLeftNode;
}
maxLeftNode.left = target.left;
maxLeftNode.right = target.right;
//置空删除节点的引用,防止内存泄露
target.parent = target.right = target.left = null;
}
}
//根据指定元素找到该节点
public Node getNode(T element){
Node current = root;
int cmp = 0;
do{
cmp = element.compareTo(current.data);
if(cmp > 0){
current = current.right;
}else if(cmp < 0){
current = current.left;
}else{
break;
}
}while(current != null);
return current;
}
//采用中序遍历二叉树,得到该2叉树的有序排列
public ListinIterator(){
return inIterator(root);
}
public ListinIterator(Node node){
Listlist = new ArrayList (); if(node.left != null){ list.addAll(inIterator(node.left)); } list.add(node); if(node.right != null){ list.addAll(inIterator(node.right)); } return list; } //获得排序二叉树的深度 public int getTreeDeep(){ return getTreeDeep(root); } public int getTreeDeep(Node node){ if(node == null){ return 0; } if(node.left == null && node.right == null){ return 1; } else{ int leftDeep = getTreeDeep(node.left); int rightDeep = getTreeDeep(node.right); int max = leftDeep>rightDeep ? leftDeep : rightDeep; return max+1; } } public static void main(String[] args) { SortedBinTree tree = new SortedBinTree (); tree.add(5); tree.add(20); tree.add(10); tree.add(3); tree.add(8); tree.add(15); tree.add(30); tree.add(32); tree.add(27); tree.add(18); System.out.println(tree.inIterator()); System.out.println("树的深度为: " + tree.getTreeDeep()); tree.remove(20); System.out.println(tree.inIterator()); System.out.println("树的深度为: " + tree.getTreeDeep()); } } 
结果如下:

java代码实现排序二叉树相关推荐

  1. 一步一图一代码之排序二叉树

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong/) 属性: ①若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值. ②若它的右子树不为空,则右子树上所 ...

  2. es查询java代码如何排序_elasticsearch 查询聚合结果排序

    一.查询结果按某个字段进行排序 { "size" : 5, "query" : { "bool" : { "filter" ...

  3. Java数据结构学习——排序二叉树

    目录 前言 正文 排序二叉树的特点 插入节点 删除树节点 删除的节点是叶子节点 删除的节点存在左或者右子节点 删除的节点存在左右两子节点 遍历节点 先序遍历 中序遍历 后续遍历 全部代码展示 总结 前 ...

  4. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  5. 二叉树 排序二叉树-可以通过中序遍历得到排序的数据 二叉排序树时间复杂度O(logn),...

    二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 虽然二叉排序树的最坏效率是O(n),但它支持动 ...

  6. java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树

    Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...

  7. 简单二叉树Java代码实现

    二叉树 文章目录 二叉树 一.二叉树是什么? 二叉树的性质 二.二叉树简单JAVA代码实现 1.Node(节点) 2.MyTree(简单二叉树) 总结 一.二叉树是什么? 二叉树是每个结点最多有两个子 ...

  8. 排序二叉树及其Java实现

    定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值: (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值: (3)左. ...

  9. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

最新文章

  1. Pandas 中的这些函数/属性将被 deprecated
  2. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)...
  3. python应该怎么自学-新手该如何学python怎么学好python?
  4. Hadoop hdfs 使用流来下载文件数据代码示例
  5. CentOS修改MySql数据库目录datadir
  6. DHCP和DHCP中继功能与配置
  7. Halcon学习笔记:读取多张图片
  8. Python中if __name__=='__main__': 理解与总结(看这篇就够了,一文扫清疑惑!)
  9. python socket tcp实战_Python socket.TCP_MAXSEG属性代码示例
  10. linux shell grep -v grep|awk ‘{print $1}‘ 是什么意思
  11. 浅析iOS程序设计模式(基于MVC)
  12. Vue-html5-editor 编辑器的使用及一些问题解决
  13. 观国庆60周年庆典阅兵式有感
  14. 新手Git for Windows 的安装、配置 及 GitHub中项目下载
  15. linux:文件操作(open、write/read、lseek、close)
  16. 什么是HomeAssistant(一)
  17. 模块已加载,但是无法找到regsvrerver入口点
  18. 包包各部位名称图解_包包的结构
  19. 如何查看Linux无线网卡驱动,怎么在Linux里查询无线网卡的驱动程序版本
  20. 【Guacamole中文文档】二、用户指南 —— 4.代理Guacamole

热门文章

  1. kwm转mp3,kwm转flac
  2. 浅谈xhr和fetch
  3. 威力曲面sw2020_威力曲面插件(SolidWorks曲面设计助手)V6.1 正式版
  4. background-attachment: fixed
  5. 十个你可能不知道的CloudFlare免费CDN加速技巧
  6. POSIX正则表达式
  7. 深度增强学习(DRL)漫谈 - 从AC(Actor-Critic)到A3C(Asynchronous Advantage Actor-Critic)
  8. 计算机网络路由器配置实验怎么做,计算机网络路由器配置实验
  9. autojs悬浮窗点击穿透
  10. 基于关联规则的足球比赛数据分析