* 二叉树排序算法看似很简单,特别是看到其他博客写的实现代码,但是如果把细节各种情况考虑进去,还是不容易的。
* 数据使用链式二叉树来存储,在增加节点的时候,小的在父节点的左边,大的在父节点的右边。刚增加的数据都是叶子节点
* 在删除的时候,可以有三种情况,分别是:(用a表示当前将要删除的节点)
* 第一,如果a是叶子节点,可以直接删除;
* 第二,如果a只有一个孩子节点,那么需要把孩子节点上移到a的位置;
* 第三,如果a有两个子节点,那么需要找到a的后继节点b(中序遍历),b移到a的位置,
* 这时候需要注意一种特殊情况,那就是后继节点b是将要删除的节点a的右孩子,需要单独处理。

还需要特别注意的情况是:如果将要删除的节点是根节点。

package com.huai.sort.binaryTree;/*** 二叉树排序算法* <p>数据使用链式二叉树来存储,在增加节点的时候,小的在父节点的左边,大的在父节点的右边。刚增加的数据都是叶子节点</p>* <p>在删除的时候,可以有三种情况,分别是:(用a表示当前将要删除的节点)* 第一,如果a是叶子节点,可以直接删除;* 第二,如果a只有一个孩子节点,那么需要把孩子节点上移到a的位置;* 第三,如果a有两个子节点,那么需要找到a的后继节点b(中序遍历),把b移到a的位置,* 这时候需要注意一种特殊情况,那就是后继节点b是将要删除的节点a的右孩子,需要单独处理。</p>* Created by liangyh on 16-1-20.*/
public class BinaryTreeSortTest {private Node head;public void print(){Node current = head;travel(head);}/*** 中序中序遍历* @param node*/private void travel(Node node){if(node == null) return;travel(node.left);System.out.print(node.data+" ");travel(node.right);}/*** 增加一个节点,小的在父节点的左边,大的在父节点的右边* @param data*/public void add(int data){Node newNode = new Node(data);if(head == null){head = newNode;return;}Node current = head;while(true){if(current.data < data){if(current.right != null) {current = current.right;} else{current.right = newNode;return;}}else{if(current.left != null) {current = current.left;} else {current.left = newNode;return;}}}}/*** 删除一个节点* @param data* @return*/public boolean delete(int data){if(head == null) return false;Node parent = head;Node current = head;boolean isLeft = true;while(current.data != data){parent = current;if(current.data < data){current = current.right;isLeft = false;}else{current = current.left;isLeft = true;}if(current == null) return false;}deleteCurrentNode2(current,isLeft, parent);return true;}/*** 删除当前节点* @param current 将要删除的节点* @param previous 当前节点的前一个节点* @param isLeftChild 当前节点是否为左孩子*/private void deleteCurrentNode(Node current, boolean isLeftChild, Node previous){//特殊处理,如果将要删除的数据是根节点if(current == head){if(head.left != null && head.right != null){previous = head;Node deletingNode = head;//保存将要删除的节点current = head.right;//寻找将要删除的节点的后继节点(中序遍历)while(current.left != null){previous = current;current = current.left;}deletingNode.data = current.data;if(previous == deletingNode)//如果后继节点是待删除节点的右子树。previous.right = current.right;elseprevious.left = current.right;}else if(head.left != null){head = head.left;}else if(head.right != null){head = head.right;}else{//head.left == null && head.right == nullhead = null;}return;}if(current.left != null && current.right != null){previous = current;Node deletingNode = current;//保存将要删除的节点current = current.right;//寻找将要删除的节点的后继节点(中序遍历)while(current.left != null){previous = current;current = current.left;}deletingNode.data = current.data;if(previous == deletingNode)//如果后继节点是待删除节点的右子树。previous.right = current.right;elseprevious.left = current.right;}else if(current.left != null){//current.left != null && current.right == nullif(isLeftChild)previous.left = current.left;elseprevious.right = current.left;}else if(current.right != null){//current.left == null && current.right != nullif(isLeftChild)previous.left = current.right;elseprevious.right = current.right;}else{//current.left == null && current.right == nullif(isLeftChild)previous.left = null;elseprevious.right = null;}}/*** 删除当前节点* @param current 将要删除的节点* @param previous 当前节点的前一个节点* @param isLeftChild 当前节点是否为左孩子*/private void deleteCurrentNode2(Node current, boolean isLeftChild, Node previous){//如果左右孩子节点都不为空if(current.left != null && current.right != null){Node deletingNode = current;//保存将要删除的节点previous = current;current = current.right;//寻找将要删除的节点的后继节点(中序遍历)while(current.left != null){previous = current;current = current.left;}deletingNode.data = current.data;if(previous == deletingNode)//如果后继节点是待删除节点的右子树。previous.right = current.right;elseprevious.left = current.right;}else if(current.left != null){//current.left != null && current.right == nullif(current == head) {
//                current = current.left;head = head.left;}else if(isLeftChild)previous.left = current.left;elseprevious.right = current.left;}else if(current.right != null){//current.left == null && current.right != nullif(current == head) {
//                current = current.right;head = head.right;}else if(isLeftChild) {previous.left = current.right;}elseprevious.right = current.right;}else{//current.left == null && current.right == nullif(current == head)head = null;else if(isLeftChild)previous.left = null;elseprevious.right = null;}}public Node getTargetNode(int data){Node current = head;while(current.data != data){if(current.data < data){current = current.right;}else{current = current.left;}if(current == null) return null;}return current;}public class Node{Node left;Node right;int data;public Node(){this.left = null;this.right = null;}public Node(int data){this.data = data;this.left = null;this.right = null;}}public static void main(String args[]){BinaryTreeSortTest sortTest = new BinaryTreeSortTest();sortTest.add(8);sortTest.add(5);
//        sortTest.add(6);
//        sortTest.add(3);
//        sortTest.add(9);
//        sortTest.add(4);
//        sortTest.add(7);
//        sortTest.add(7);
//        sortTest.add(7);
//        sortTest.add(8);sortTest.print();System.out.println();boolean flag = sortTest.delete(8);sortTest.print();}
}

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

  1. Java数据结构——排序二叉树

    排序二叉树概念 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树.是数据结构中的一类. 对于二叉排序树的任何一个非叶子节点, 要求 ...

  2. java代码实现排序二叉树

    创建排序二叉树的步骤: 1.以根节点为当前节点开始搜索 2.拿新节点的值和当前节点的值比较 3.如果新节点的值更大,则以当前结点的右子节点作为新的当前节点:如果新节点的值更小,则以当前节点的左子节点作 ...

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

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

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

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

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

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

  6. java arraylist排序_最全Java集合笔记

    集合概述 什么是集合 集合框架:用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:表示集 ...

  7. Java算法-排序-选择排序

    昨天写了5大排序的交换排序,女朋友给我一个大大的赞,今天一天激情满满.下班了,有时间整理一下另外的排序算法,今晚就写写选择排序吧 二.选择排序(直接选择排序+堆排序) 1.直接选择排序 直接选择排序的 ...

  8. 排序二叉树(概念性)了解一下

    文章目录 基本概念 基本算法 1.查找 2.遍历 3.插入 4.删除 平衡的排序二叉树 参考文章 基本概念 树的基本概念,在计算机程序中,树是从上往下长的,也会有分叉,有个根节点,每个节点可以有一个或 ...

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

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

最新文章

  1. UE把环境变量Path改了
  2. python访问数据库oracle_python连接oracle数据库
  3. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
  4. IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码
  5. 使用xml及java代码混合的方式来设置图形界面
  6. 介绍一个修改 Visual Studio Code 侧边框颜色的扩展 Peacock
  7. 前端学习(2487):在VUE中使用element-ui的el-select组件时出现该报错
  8. 【Java数据结构与算法】第十三章 二叉排序树和平衡二叉树
  9. 手机modem开发(15)---FT 测试天线注意事项
  10. 【clickhouse】clickhouse TCP 方式发送数据 ClickHouse-Native-JDBC
  11. C++代码 快速排序总结
  12. 最好的 Windows C++ 编译器!
  13. python如何使用函数_python中函数使用
  14. SQL中的ROW_NUMBER()和while循环对每一行执行操作
  15. [转]RDLC 动态列
  16. 阿里云祝顺民:未来的网络是云网一体,应用感知不到网络的存在
  17. 基于聚类算法与随机森林算法的手机终端换机推荐
  18. HTTP协议解说以及TCP/IP认识
  19. 产生指数分布的随机数 C语言实现
  20. 【Chrome】678- Chrome插件开发全攻略

热门文章

  1. android时间轴折线图,带时间轴的折线图
  2. 【c语言】求最大公约数
  3. linux efi启动,可启动USB Linux的EFI/ UEFI
  4. Python SQLAlchemy
  5. python——def自定义函数的应用
  6. 《剑指offer》-左旋转字符串
  7. 如何成为一名优秀的软件架构师?
  8. Linux device tree 简要笔记
  9. out与ref的区别
  10. 计算机加入域后远程桌面无法登陆域账户