二叉树排序----基于比较器的排序原理

二叉树排序----基于比较器排序原理

前言

​ 实际上Comparable接口的比较器排序也就是数据结构中的二叉树排序算法,先通过构建排序二叉树,之后根据中序遍历将结果读出来,即为排序的结果。

​ 如有小伙伴还未接触数据结构和排序二叉树,请先学习关于二叉树的知识哦!

在这里插入图片描述

案例演示

​ 基于Comparable接口实现的二叉树操作(Student类在上篇文章中定义有哦)

package chapter_eleven;

//定义排序二叉树类,本类中有排序二叉树的根节点,增加结点方法,输出排序结果方法
class BinaryTree{

    private Node root;                          //定义排序二叉树的根节点

    public void add(Comparable data){          //定义为二叉树增加节点的方法,此节点必须为实现Comparable接口的类
        Node node = new Node();                     //实例化一个二叉树结点
        node.data = data;                           //将此对象作为二叉树结点的数据
        if(root == null){               //若根节点为null,则将此节点先添加至根节点
            root = node;
        }else{
            root.addNode(node);         //否则将此节点添加到排序二叉树中
        }
    }

    public void print(){                        //定义输出排序二叉树的方法
        this.root.printNode();                  //使用中序遍历排序二叉树,输出排序结果
    }

    class Node{                                 //定义排序二叉树的节点类,此类为内部类
        private Comparable data;                //节点数据,利用对象多态性的向上转型,Comparable接口子类均可为其实例化
        private Node left;                          //节点的左子树
        private Node right;                         //节点的右子树

        /**
         * //定义为排序二叉树添加节点的方法
         * @param node
         */
        public void addNode(Node node){

            if(node.data.compareTo(this.data) < 0){     //使用compareTo()方法对增加节点与根节点进行比较,若小于0添加左子树
                if(this.left == null){                  //左子树无根则直接添加
                    this.left = node;
                }else{
                    this.left.addNode(node);            //否则将此节点直接添加至左子树
                }
            }

            if(node.data.compareTo(this.data) >= 0){     //使用compareTo()方法对增加节点与根节点进行比较,大于等于0添加右子树
                if(this.right == null){
                    this.right = node;              //右子树无根则直接添加
                }else{
                    this.right.addNode(node);       //否则将此节点添加至右子树
                }
            }

        }

        /**
         * 定义中序遍历排序二叉树的方法,以排序的方式打印所有信息
         */
        public void printNode(){
            if(this.left != null){              //先遍历左子树
                this.left.printNode();                  //递归遍历左子树
            }
            System.out.print(this.data);            //遍历根节点
            if(this.right != null){             //遍历右子树
                this.right.printNode();                 //递归遍历右子树
            }
        }

    }
}

public class ComparableDemo03 {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();               //声明并实例化排序二叉树

        binaryTree.add(new Student("张三",20,90.0f));     //为排序二叉树添加节点
        binaryTree.add(new Student("李四", 21, 90.0f));       //实现Comparable接口的类均可以添加
        binaryTree.add(new Student("王五", 20, 99.0f));
        binaryTree.add(new Student("赵六", 20, 70.0f));
        binaryTree.add(new Student("孙七", 22, 100.0f));

        System.out.println("排序之后的结果:");
        binaryTree.print();                                                  //输出排序的结果
    }
}

运行结果

排序之后的结果:
{name='孙七', age=22, score=100.0}
{name='王五', age=20, score=99.0}
{name='张三', age=20, score=90.0}
{name='李四', age=21, score=90.0}
{name='赵六', age=20, score=70.0}

总结

​ 使用Comparable比较器的接口可以方便的定义类对象的排序规则,结合数据结构算法可以很好的实现排序算法,哈哈哈,对于此二叉树排序算法,小伙伴们理解即可,因为java中已经提供了对数据结构算法的支持类库类集,会使用开发即可,加油,冲冲冲!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gaolw1102

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值