Comparable比较器排序远离实现

  1. package test.java.api.api13;
  2.  
  3. /**
  4. * 手工实现二叉树的比较算法: 第一遍感觉很神秘,但是真正自己写下来,就感觉很简单,理解就好: 主要一下两点: 第一点:【设置一个根节点】
  5. * 第二点:新增节点处理:比根节点小,放在左子树(如果左子树不存在,直接放在左子树,如果存在,用已经存在的左子树的节点递归调用)
  6. * 第三点:新增节点处理:比根节点大或等于,放在右子树(如果右子树不存在,直接放在右子树,如果存在,用已经存在的右子树的节点递归调用)
  7. * 第四点:打印输出:已经排好序的数据用中序遍历:左→根→右,进行输出
  8. *
  9. * @author gmq
  10. * @dateTime 2015/11/1
  11. *
  12. */
  13. public class ComparableDemo03 {
  14.  
  15. public static void main(String[] args) {
  16. BinaryTree<Integer> bt = new BinaryTree<Integer>();
  17. bt.add(8);
  18. bt.add(7);
  19. bt.add(6);
  20. bt.add(11);
  21. bt.add(8);
  22. bt.add(9);
  23. bt.add(3);
  24.  
  25. System.out.println("排序之后的结果:");
  26. bt.print();
  27. }
  28. }
  29.  
  30. /**
  31. * 二叉树算法类
  32. *
  33. * @author gmq
  34. *
  35. */
  36. class BinaryTree<T> {
  37.  
  38. class Node { // 声明一个节点类Node
  39. private Comparable<T> data; // 保存具体的内容
  40. private Node left; // 左子树
  41. private Node right; // 右子树
  42.  
  43. public Node(Comparable<T> data) {
  44. this.data = data;
  45. }
  46.  
  47. public void addNode(Node newNode) {
  48. // 确定是放在左子树还是右子树
  49. if (newNode.data.compareTo((T) this.data) < 0) { // 内容小,放在左子树
  50. if (this.left == null) { // 判断左子树是否存在
  51. this.left = newNode; // 直接将新的节点设为左子树
  52. } else {
  53. this.left.addNode(newNode); // 继续向下判断
  54. }
  55. }
  56.  
  57. if (newNode.data.compareTo((T) this.data) >= 0) { // 放在右子树
  58. if (this.right == null) { // 判断右子树是否存在
  59. this.right = newNode; // 右子树不存在:直接将新的节点放在右子树
  60. } else {
  61. this.right.addNode(newNode); // 继续向下判断
  62. }
  63. }
  64. }
  65.  
  66. public void print() { // 输出的时候采用中序遍历: 左→根→右
  67. // 先遍历左节点
  68. if (this.left != null) {
  69. left.print();
  70. }
  71.  
  72. // 再遍历根节点
  73. System.out.print(this.data + "\t");
  74.  
  75. // 最后遍历右节点
  76. if (this.right != null) {
  77. this.right.print();
  78. }
  79. }
  80. }
  81.  
  82. private Node root; // 跟节点
  83.  
  84. public void add(Comparable<T> data) {
  85. Node newNode = new Node(data);
  86. if (root == null) {
  87. root = newNode;
  88. } else {
  89. root.addNode(newNode);
  90. }
  91. }
  92.  
  93. public void print() {
  94. this.root.print(); // 通过根节点输出
  95. }
  96. }

算法:comparable比较器的排序原理实现(二叉树中序排序)的更多相关文章

  1. 二叉树中序遍历 (C语言实现)

    在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...

  2. 94 Binary Tree Inorder Traversal(二叉树中序遍历Medium)

    题目意思:二叉树中序遍历,结果存在vector<int>中 解题思路:迭代 迭代实现: /** * Definition for a binary tree node. * struct ...

  3. [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...

  4. 10.26最后的模拟DAY2 改造二叉树[中序遍历+严格递增的最长不下降子序列]

    改造二叉树 [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他 ...

  5. [Leetcode] Binary tree inorder traversal二叉树中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  6. lintcode.67 二叉树中序遍历

    二叉树的中序遍历    描述 笔记 数据 评测 给出一棵二叉树,返回其中序遍历 您在真实的面试中是否遇到过这个题? Yes 样例 给出二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,3, ...

  7. C++版 - 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解

    面试题 63:二叉搜索树的第k个结点 题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 (见下面的图1) 中,按结点数值大小顺序第三个结点的值 ...

  8. LeetCode:94_Binary Tree Inorder Traversal | 二叉树中序遍历 | Medium

    题目:Binary Tree Inorder Traversal 二叉树的中序遍历,和前序.中序一样的处理方式,代码见下: struct TreeNode { int val; TreeNode* l ...

  9. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

随机推荐

  1. 图解Android - System Service 概论 和 Android GUI 系统

    通过 图解Android - Binder 和 Service 一文中,我们已经分析了Binder 和 Service的工作原理.接下来,我们来简要分析Android 系统里面都有哪些重要的Servi ...

  2. ORACLE创建表空间、创建用户、更改用户默认表空间以及授权、查看权限

    Oracle创建用户.表空间.导入导出....命令 //创建临时表空间 create temporary tablespace ext_temptempfile 'D:\oracle\product\ ...

  3. Windows python3.3下安装BeautifulSoup

    首先在官网下载:http://www.crummy.com/software/BeautifulSoup/#Download BeautifulSoup在版本4以上都开始支持python3了,所以就下 ...

  4. .net 时间戳互相转换(精确到毫秒)

    这里记录一个时间戳的互相转换方法,网上都找了,基本都没有精确到毫秒,我的这个基本可以满足精确到毫秒的级别,代码如下: /// <summary> /// Unix时间戳转换为DateTim ...

  5. UVA10118(记忆化搜索 + 好题)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19440 题意,4堆不同颜色的糖果,每堆N个,从堆上往下拿,放入一个最大装5个 ...

  6. mysql语句分析

    explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1,id   select识别符.这是select的查询序列号.2,select_type 可以为一下任何一种类型simple ...

  7. tp三大自动

    ThinkPHP三大自动 (2012-03-21 10:48:56) 转载▼ 标签: thinkphp 三大自动 自动验证 自动完成 自动填充 自动映射 字段映射 杂谈 分类: php 一.自动验证 ...

  8. VS2010+OpenCV2.4.6永久性配置方法

    1. 配置OpenCV环境变量 计算机->(右键)属性,出现如图1所示界面 单击“高级系统设置”,选中高级(标签)出现如图2所示界面 单击右下方的“环境变量”,弹出如图3所示界面,注意这里最好用 ...

  9. Socket 入门- 客户端回射程序

    结果输出:------------------------------------------------------客户端:xx@xxxxxx:~/Public/C$ ./postBackCli.o ...

  10. 32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0

    http://www.cnblogs.com/shanyou/archive/2012/01/07/2315982.html shanyou 博客