zoukankan      html  css  js  c++  java
  • 算法:comparable比较器的排序原理实现(二叉树中序排序)

    Comparable比较器排序远离实现

    package test.java.api.api13;
    
    /**
     * 手工实现二叉树的比较算法: 第一遍感觉很神秘,但是真正自己写下来,就感觉很简单,理解就好: 主要一下两点: 第一点:【设置一个根节点】
     * 第二点:新增节点处理:比根节点小,放在左子树(如果左子树不存在,直接放在左子树,如果存在,用已经存在的左子树的节点递归调用)
     * 第三点:新增节点处理:比根节点大或等于,放在右子树(如果右子树不存在,直接放在右子树,如果存在,用已经存在的右子树的节点递归调用)
     * 第四点:打印输出:已经排好序的数据用中序遍历:左→根→右,进行输出
     * 
     * @author gmq
     * @dateTime 2015/11/1
     *
     */
    public class ComparableDemo03 {
    
        public static void main(String[] args) {
            BinaryTree<Integer> bt = new BinaryTree<Integer>();
            bt.add(8);
            bt.add(7);
            bt.add(6);
            bt.add(11);
            bt.add(8);
            bt.add(9);
            bt.add(3);
    
            System.out.println("排序之后的结果:");
            bt.print();
        }
    }
    
    /**
     * 二叉树算法类
     * 
     * @author gmq
     *
     */
    class BinaryTree<T> {
    
        class Node { // 声明一个节点类Node
            private Comparable<T> data; // 保存具体的内容
            private Node left; // 左子树
            private Node right; // 右子树
    
            public Node(Comparable<T> data) {
                this.data = data;
            }
    
            public void addNode(Node newNode) {
                // 确定是放在左子树还是右子树
                if (newNode.data.compareTo((T) this.data) < 0) { // 内容小,放在左子树
                    if (this.left == null) { // 判断左子树是否存在
                        this.left = newNode; // 直接将新的节点设为左子树
                    } else {
                        this.left.addNode(newNode); // 继续向下判断
                    }
                }
    
                if (newNode.data.compareTo((T) this.data) >= 0) { // 放在右子树
                    if (this.right == null) { // 判断右子树是否存在
                        this.right = newNode; // 右子树不存在:直接将新的节点放在右子树
                    } else {
                        this.right.addNode(newNode); // 继续向下判断
                    }
                }
            }
    
            public void print() { // 输出的时候采用中序遍历: 左→根→右
                // 先遍历左节点
                if (this.left != null) {
                    left.print();
                }
    
                // 再遍历根节点
                System.out.print(this.data + "	");
    
                // 最后遍历右节点
                if (this.right != null) {
                    this.right.print();
                }
            }
        }
    
        private Node root; // 跟节点
    
        public void add(Comparable<T> data) {
            Node newNode = new Node(data);
            if (root == null) {
                root = newNode;
            } else {
                root.addNode(newNode);
            }
        }
    
        public void print() {
            this.root.print(); // 通过根节点输出
        }
    }
  • 相关阅读:
    Windows7下安装golang语言开发环境和revel框架
    Go实战--通过gin-gonic框架搭建restful api服务(github.com/gin-gonic/gin)
    Go语言web框架 gin
    最好的6个Go语言Web框架
    mac:Go安装和配置+GoLand安装和使用之完整教程
    Goland软件使用教程(二)
    Goland软件使用教程(一)
    http_load常见问题及解决方案
    定义类和接口
    关于 xftp 上传文件时,仅仅是上传了0字节的问题
  • 原文地址:https://www.cnblogs.com/gmq-sh/p/4928721.html
Copyright © 2011-2022 走看看