二叉树

主要包括根节点,左孩子和右孩子

二叉排序的基本原理

把第一个元素作为根节点,之后的元素如果比第一个元素大,放到右面,否则放到左面

算法步骤

先声明一个节点类Node,里面有根节点,左孩子和右孩子
然后创建一个构造函数里面放的是根节点
然后写一个添加节点的方法,我们给他起名为add方法

先把创建树的代码写一下
class Node,声明一个节点类Node
里面有根节点,左右孩子,然后创建一个根节点的构造方法,方便后面使用。

class newTree{class Node{int data;//根节点Node left;//左孩子Node right;//右孩子public Node(int data) {//构造方法this.data = data;}}
}

举个例子

这个是一个数组,首先我们把第一个元素拿出来作为二叉树的根节点,然后看第二个元素5,大于根节点,放在根节点的右面。

然后在看下一个元素2,小于根节点放在根节点的左面。

在看下一个元素8,比根节点大,放在右面,然后在和右面的元素5比较,比5大放在5这个节点的右边。

在看下一个元素4,比根节点大,放在右面,比右面二个节点5小,所以放在5的左面。

下一个元素6,大于根节点,并且大于右面第二个节点5,但是小于5右面的节点8,所以这个元素放在5元素的左节点4的右边。

以此类推,最后就是这个样子

接下来我们要做的事情就是想我们刚才举的例子一样把数组中的元素创建成一个二叉树。
首先放第一个元素的时候要创建根节点,如果不是第一次放入,我们需要两个指针,p和parent,初始化都指向根节点。

那么这两个的指针分别是什么作用,p指针可以理解成是探底的,找到该放元素的位置结束循环,Parent指针永远指向p指针的上一个元素,p.next就是元素要放的位置。
比如现在有一个新的节点1 ,把他放入到二叉树中,我们可以看到1比根节点小,那么他应该放到3的左面,首先移动p指针,他去比较,找到1因该放到的位置。

现在p指向这个位置,然后2节点比1大,然后移动p指针,这次parent指针要移动了,现在是这个样子

p指针找到要放的位置,然后结束循环,然后parent指针的下一个元素就是1要放的位置,我们现在找到元素要放的位置,那么要如何放进去,这个时候我们要进行判断,看数据要放在这个节点的左面还是右面,那么就要进行比较。

 private Node root;//根节点public void add(int data) {Node newNode = new Node(data);//新的根节点//第一次放入-->要创建根节点if(root == null) {root = newNode;return ;}//不是第一次放入 -->双指针Node p = root;//探底,结束循环Node partent = root;//作用指向p的上一级//作用找到元素的位置while(p != null) {partent = p;if(data > p.data) {//大于在右边p = p.right;}else {p = p.left;//否则在左边}}//将元素放进去if(data > partent.data) {partent.right = newNode;}else {partent.left = newNode;}}

二叉树有三种遍历方式,前序,中序和后序
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
可以发现起名前,中,后,这个命名方式和根在位置一样,看对角线,方便 记忆一些
然后我们就分别写,前,中,后序遍历的方法

 //前序遍历private void preOrder(Node node) {if(node != null) {System.out.print(node.data + " ");preOrder(node.left);preOrder(node.right);}}//中序private void midOrder(Node node) {if(node != null) {midOrder(node.left);System.out.print(node.data + " ");midOrder(node.right);}}//后序private void afterOrder(Node node) {if(node != null) {preOrder(node.left);preOrder(node.right);System.out.print(node.data + " ");}}

因为我方法定义的是私有的所以需要给外界提供一个公共的方法调用

//前序public void preOrder() {//给外界提供一个公共方法调用preOrder(root);}//中序public void midOrder() {midOrder(root);}//后序public void afterOrder() {afterOrder(root);}

这样就写好了,完整代码如下

public class BinarySortTree {public static void main(String[] args) {int  [] arr = {3,5,2,8,4,6,7,9,4}; SortTree tree = new SortTree();for(int i : arr) {tree.add(i);}System.out.println("前序遍历:");tree.preOrder();System.out.println(" ");System.out.println("中序遍历:");tree.midOrder();System.out.println(" ");System.out.println("后序遍历:");tree.afterOrder();System.out.println(" ");}}
class SortTree{class Node{int data;//根节点Node left;//左孩子Node right;//右孩子public Node(int data) {//构造方法this.data = data;this.left = null;this.right = null;} }private Node root;//根节点public void add(int data) {Node newNode =  new Node(data);//新的根节点//第一次放入要创建根节点if(root == null) {root = newNode;return ;}//如果不是第一次放入,双指针Node p = root;Node parent = root;//parent 的作用是一直指向p的上一级while(p != null) {parent = p;if(data > p.data) {p = p.right;}else {p = p.left;}}if(data > parent.data) {parent.right = newNode;}else {parent.left = newNode;} }//前序遍历private void preOrder(Node node) {if(node != null) {System.out.print(node.data + " ");preOrder(node.left);preOrder(node.right);}}//中序private void midOrder(Node node) {if(node != null) {midOrder(node.left);System.out.print(node.data + " ");midOrder(node.right);}}//后序private void afterOrder(Node node) {if(node != null) {preOrder(node.left);preOrder(node.right);System.out.print(node.data + " ");}}//前序public void preOrder() {//给外界提供一个公共方法调用preOrder(root);}//中序public void midOrder() {midOrder(root);}//后序public void afterOrder() {afterOrder(root);}}

输出
前序遍历:
3 2 5 4 4 8 6 7 9
中序遍历:
2 3 4 4 5 6 7 8 9
后序遍历:
2 5 4 4 8 6 7 9 3
可以看出中序遍历就是数组从小到大排序。

如果有哪里理解的不对,欢迎指正,谢谢~

二叉树排序算法(java)相关推荐

  1. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  2. 二叉树排序(java)

    package ding1; //二叉树排序import java.util.Scanner; //数组用的是位序!!class A{ void exch(int a[],int i,int j) { ...

  3. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  4. 八大排序算法Java

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  5. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  6. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  7. java基础排序_Java排序算法-Java入门|Java基础课程

    1. 课程目标排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2 ...

  8. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  9. 常用排序算法-----------JAVA实现

    #常用排序算法-插入排序,选择排序,交换排序,归并排序,基数排序 ###排序算法可归类为以下几类: 插入排序: 直接插入排序(DirectInsertSort): 二分法排序(BinarySort): ...

  10. 排序算法 -- Java

    排序算法 冒泡排序 选择排序 反转排序 冒泡排序 算法思想:从前往后逐步对比每个相邻元素值,满足条件则交换. 实现细节:双层循环,外层循环是排序轮数-(数组长度-1),内层循环负责对比和交换次数-(数 ...

最新文章

  1. mysql乐观锁处理超卖_通过乐观锁解决库存超卖的问题
  2. Python重装时记录所有库 生成requirement 使用requirements.txt
  3. Linux中source命令的用法
  4. JQuery中ajax方法访问web服务
  5. linux deepin ubuntu apt安装openjdk-8-jdk
  6. 代理模式源码解析(jdk+spring+mybatis)
  7. $.each()与$(selector).each()
  8. 0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?
  9. 总结下2018年,我们归纳了几种将对智能安防产生影响的技术发展趋势
  10. 决策树(十三)--XGBoost参数调优完全指南
  11. 循证医学 计算机辅助决策系统,循证医学重点整理
  12. 电路设计_示波器接地常识
  13. php对图片反色处理
  14. golang httpServer对于keepAlive长连接的处理方式
  15. 利用python爬取租房信息_Python实战:爬取租房信息
  16. 设正整数n的十进制表示为n=ak……a1a0(0=ai=9,0=i=k,ak!=0),n的个位为起始数字的数字的正负交错之和T(n)=a0+a1+……+(-1)kak,证明:11|n的充分必要...
  17. 【优秀课设】基于Linux粤嵌GEC6818开发板的电子乐队程序设计(四种模式:和弦模式、键盘模式、鼓点模式、编曲模式)
  18. 聊天系统php源码,PHP聊天系统DuckCha 功能非常强大的在线聊天程序源码
  19. React的非受控组件和受控组件
  20. 分布式技术高频面试考点梳理

热门文章

  1. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统
  2. kali linux 网卡配置ip地址,Kali Linux常用服务配置教程获取IP地址
  3. excel转kml工具_解决你的痛点:DWG与KML互转
  4. 南京师范大学计算机技术调剂,南京师范大学2017年考研调剂信息
  5. linux中如何使用find命令查找文件
  6. GlobalKey的使用方法
  7. 前缀式与后缀式的差别
  8. 华为云部署YOLOv5
  9. 【读书2】【2014】基于MATLAB的雷达信号处理基础(第二版)——雷达散射截面的统计描述(7)
  10. 畅想未来计算机300字,写畅想未来的作文300字