二叉树排序

1.二叉树由各种节点组成

      每个节点都可以有左子节点,右子节点
      每一个节点都有一个值

2.排序

      二叉树的遍历分左序,中序,右序
            左序即: 中间的数遍历后放在左边
            中序即: 中间的数遍历后放在中间
            右序即: 中间的数遍历后放在右边
      如图所见,我们希望遍历后的结果是从小到大的,所以应该采用中序遍历

3.比较冒泡法,选择法以及二叉树排序的性能区别

 

4.结构图

5.MyNode

public class MyNode {
    
    private Integer value;//当前值;
    private MyNode leftNode;//左叶子节点;
    private MyNode rightNode;//右叶子节点;
    
    public MyNode() {
        //super();
    }
    
    public MyNode(int value, MyNode leftNode, MyNode rightNode) {
        //super();
        this.value = value;
        this.leftNode = leftNode;
        this.rightNode = rightNode;
    }
    
    //添加元素
    public void addNode(int nValue){
        
        if(null == value){
            value = nValue;//当前节点没有值则放入数据到该节点中
            return;
        }
        
        if((value - nValue) >= 0){//当前节点大于等于待插入的值,需放入其左侧节点
            if(null == leftNode){//左侧叶子节点为null则设置该元素为左侧叶子节点
                leftNode = new MyNode(nValue,null,null);
                return;
            }
            leftNode.addNode(nValue);//存在左侧叶子节点则便利插入:
        }else{//当前节点小于待插入的值,需放入其右侧节点
            if(null == rightNode){//右侧叶子节点为null则设置该元素为右侧叶子节点
                rightNode = new MyNode(nValue,null,null);
                return;
            }
            rightNode.addNode(nValue);
        }
    }
    
    //中序便利
    public List<MyNode> sortByCenter(){
        List<MyNode> list = new ArrayList<MyNode>();
        
        //存放左侧的节点,当前节点,右侧节点
        if(null != leftNode){
            list.addAll(leftNode.sortByCenter());
        }
        
        list.add(this);
        
        if(null != rightNode){
            list.addAll(rightNode.sortByCenter());
        }
        
        return list;
    }
    

}

6.TwoTree

/**
 * 二叉树
 * @author dada
 *
 */
public class TwoTree {
    private MyNode top;//头节点;
    private int size;//二叉树的总数据个数;
    public TwoTree() {
        top = new MyNode();
        size = 0;
    }
    /**
     * 添加元素到二叉树中
     * @param nValue
     */
    public void addNodeToTree(int nValue){//添加节点到二叉树中
        top.addNode(nValue);
        size ++;
    }
    /**
     * 返回二叉树的元素个数
     * @return
     */
    public int size(){//获取二叉树的元素个数
        return size;
    }
    /**
     * 中序便利二叉树:左侧节点-当前节点-右侧节点
     * @return
     */
    public List<MyNode> sortByCenterTree(){
        return top.sortByCenter();
    }
    /**
     * 返回二叉树的头节点
     * @return
     */
    public MyNode getTop(){
        return top;
    }
}

7.NodeMain

public class NodeMain {
    
    public static void main(String[] args) {
       
        //初始化二叉树;
        TwoTree tree = new TwoTree();
        
        //添加元素到二叉树中:
        int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74, 10 };
        for (int number : randoms) {
            tree.addNodeToTree(number);
        }
        
        //中序便利二叉树
        List<MyNode> listNode = tree.sortByCenterTree();
        for (MyNode myNode : listNode) {
            System.out.print(myNode.getValue()+",");
        }
        System.out.println();
        
        //获取头节点
        MyNode top = tree.getTop();
        System.out.println("二叉树头节点的值为:"+top.getValue()+",二叉树元素个数为:"+tree.size());
 
    }

}

8.输出结果

0,7,10,10,10,30,67,73,74,78,81,
二叉树头节点的值为:67,二叉树元素个数为:11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值