二叉树排序方法1
class BinaryTree {
class Node{ // 声明一个节点类
private Comparable data ; // 保存具体的内容
private Node left ; // 保存左子树
private Node right ; // 保存右子树
public Node(Comparable data){
this.data = data ;
}
public void addNode(Node newNode){
// 确定是放在左子树还是右子树
if(newNode.data.compareTo( this.data)<0){ // 内容小,放在左子树
if( this.left== null){
this.left = newNode ; // 直接将新的节点设置成左子树
} else{
this.left.addNode(newNode) ; // 继续向下判断
}
}
if(newNode.data.compareTo( this.data)>=0){ // 放在右子树
if( this.right== null){
this.right = newNode ; // 没有右子树则将此节点设置成右子树
} else{
this.right.addNode(newNode) ; // 继续向下判断
}
}
}
public void printNode(){ // 输出的时候采用中序遍历
if( this.left!= null){
this.left.printNode() ; // 输出左子树
}
System.out.print( this.data + "\t") ;
if( this.right!= null){
this.right.printNode() ;
}
}
};
private Node root ; // 根元素
public void add(Comparable data){ // 加入元素
Node newNode = new Node(data) ; // 定义新的节点
if(root== null){ // 没有根节点
root = newNode ; // 第一个元素作为根节点
} else{
root.addNode(newNode) ; // 确定是放在左子树还是放在右子树
}
}
public void print(){
this.root.printNode() ; // 通过根节点输出
}
}
public class ComparableDemo {
/**实际上比较器的操作就是经常说的二叉树的排序算法。
* 原理:使用第一个元素作为根节点,后面的内容比根节点大,就放在左子树,后面的内容比根节点小,就放在右子树。
*
*/
public static void main(String[] args) {
BinaryTree bt = new BinaryTree() ;
bt.add(8) ;
bt.add(3) ;
bt.add(3) ;
bt.add(10) ;
bt.add(9) ;
bt.add(1) ;
bt.add(5) ;
bt.add(5) ;
System.out.println( "排序之后的结果:") ;
bt.print() ;
}
}
二叉树排序方法2:
class Student {
private String name ;
private int age ;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this.age = age;
}
@Override
public boolean equals(Object obj){ // 覆写equals方法
if( this==obj){
return true ;
}
if(!(obj instanceof Student)){
return false ;
}
Student stu = (Student) obj ;
if(stu.name.equals( this.name)&&stu.age== this.age){
return true ;
} else{
return false ;
}
}
public String toString(){
return name + "\t\t" + this.age ;
}
}
import java.util.Comparator;
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student s1,Student s2) {
if(s1.equals(s2)){
return 0 ;
} else if(s1.getAge()<s2.getAge()){ // 按年龄比较
return 1 ;
} else{
return -1 ;
}
}
}
public class ComparatorDemo {
/**
* 如果一个类已经开发完成,但是在此类建立初期并没有实现Comparable接口,此时肯定无法进行对象排序操作的, 为了解决这一问题
* Java有定义了Comparator比较器
*
*/
public static void main(String[] args) {
Student stu[] = { new Student( "张三", 20), new Student( "李四", 22),
new Student( "王五", 20), new Student( "赵六", 20),
new Student( "孙七", 22) };
java.util.Arrays.sort(stu, new StudentComparator()); // 进行排序操作
for ( int i = 0; i < stu.length; i++) { // 循环输出数组中的内容
System.out.println(stu[i]);
}
}
}
class BinaryTree {
class Node{ // 声明一个节点类
private Comparable data ; // 保存具体的内容
private Node left ; // 保存左子树
private Node right ; // 保存右子树
public Node(Comparable data){
this.data = data ;
}
public void addNode(Node newNode){
// 确定是放在左子树还是右子树
if(newNode.data.compareTo( this.data)<0){ // 内容小,放在左子树
if( this.left== null){
this.left = newNode ; // 直接将新的节点设置成左子树
} else{
this.left.addNode(newNode) ; // 继续向下判断
}
}
if(newNode.data.compareTo( this.data)>=0){ // 放在右子树
if( this.right== null){
this.right = newNode ; // 没有右子树则将此节点设置成右子树
} else{
this.right.addNode(newNode) ; // 继续向下判断
}
}
}
public void printNode(){ // 输出的时候采用中序遍历
if( this.left!= null){
this.left.printNode() ; // 输出左子树
}
System.out.print( this.data + "\t") ;
if( this.right!= null){
this.right.printNode() ;
}
}
};
private Node root ; // 根元素
public void add(Comparable data){ // 加入元素
Node newNode = new Node(data) ; // 定义新的节点
if(root== null){ // 没有根节点
root = newNode ; // 第一个元素作为根节点
} else{
root.addNode(newNode) ; // 确定是放在左子树还是放在右子树
}
}
public void print(){
this.root.printNode() ; // 通过根节点输出
}
}
public class ComparableDemo {
/**实际上比较器的操作就是经常说的二叉树的排序算法。
* 原理:使用第一个元素作为根节点,后面的内容比根节点大,就放在左子树,后面的内容比根节点小,就放在右子树。
*
*/
public static void main(String[] args) {
BinaryTree bt = new BinaryTree() ;
bt.add(8) ;
bt.add(3) ;
bt.add(3) ;
bt.add(10) ;
bt.add(9) ;
bt.add(1) ;
bt.add(5) ;
bt.add(5) ;
System.out.println( "排序之后的结果:") ;
bt.print() ;
}
}
class Student {
private String name ;
private int age ;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this.age = age;
}
@Override
public boolean equals(Object obj){ // 覆写equals方法
if( this==obj){
return true ;
}
if(!(obj instanceof Student)){
return false ;
}
Student stu = (Student) obj ;
if(stu.name.equals( this.name)&&stu.age== this.age){
return true ;
} else{
return false ;
}
}
public String toString(){
return name + "\t\t" + this.age ;
}
}
import java.util.Comparator;
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student s1,Student s2) {
if(s1.equals(s2)){
return 0 ;
} else if(s1.getAge()<s2.getAge()){ // 按年龄比较
return 1 ;
} else{
return -1 ;
}
}
}
public class ComparatorDemo {
/**
* 如果一个类已经开发完成,但是在此类建立初期并没有实现Comparable接口,此时肯定无法进行对象排序操作的, 为了解决这一问题
* Java有定义了Comparator比较器
*
*/
public static void main(String[] args) {
Student stu[] = { new Student( "张三", 20), new Student( "李四", 22),
new Student( "王五", 20), new Student( "赵六", 20),
new Student( "孙七", 22) };
java.util.Arrays.sort(stu, new StudentComparator()); // 进行排序操作
for ( int i = 0; i < stu.length; i++) { // 循环输出数组中的内容
System.out.println(stu[i]);
}
}
}
转载于:https://blog.51cto.com/haiyuanxi/931166