创建排序二叉树的步骤:

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. CSS定位布局display/float/position属性之间的关系/区别和如何使用取值行为机制
  2. XCode Could not launch quot;quot; failed to get the task for process
  3. C语言如何产生随机数
  4. 本科 8年经验,20k的Offer,接还是不接?
  5. php 伪静态 500错误,Apache开启伪静态后报500错误.
  6. easyui datagrid 获得共多少条记录_聊城市优化简化获得电力流程做法在全省供电系统推广...
  7. 单点登录有关跨域的点
  8. asp.net Checkbox 绑定自定义属性
  9. iOS开发——AVPlayer自定义播放器(持续更新,学习中)
  10. 全连接简单minist操作
  11. 3D Vision、SLAM求职宝典 | 图像处理篇(C)
  12. 行满秩矩阵为何变成增广矩阵还为满秩
  13. 一种鼠标手势识别的方案
  14. php项目排期表模板,最近在开发后台管理,想问下广告排期表怎么做?
  15. 苏州新导化工厂人员定位系统功能真的如此强大?当然强大,定位准确
  16. 定制Directives
  17. vue3+ant design vue+ts实战【ant-design-vue组件库引入】
  18. Android设置全局字体大小,实现小中大字体功能
  19. 标题党:如何写出SEO与新媒体平台都吸喜欢的标题!
  20. MFC中dlg.DoModal()返回-1

热门文章

  1. 领悟《信号与系统》之 采样定理
  2. hexo latex 换行 多行公式 终极解决方案
  3. Centos8搭建并应用NIS服务
  4. docx-templates前端模板引擎生成word
  5. 现在好的测试缺陷管理工具都有哪些啊?
  6. Spring 发送Email
  7. imagecreatefromjpeg():gd-jpeg:JPEG
  8. 最新搜索引擎提交网站的入口及技巧
  9. 国密算法(SM2,SM3,SM4)辅助工具升级版(OTP+PBOC3.0)
  10. 迭代器 (Iterator迭代器接口)