zoukankan      html  css  js  c++  java
  • 数据结构之 二叉树

    对象由指针所构成的关系有很多种,如果没有循环可以广义称为树,否则称为图。

    而二叉树是一种特殊的树形结构。常用与二叉树排序的应用。
    二叉树的定义:  每个结点最多有两个子树的结构称为二叉树。所以两个分叉可以分别称为左子树和右子树
    根节点:每棵树中只有1个根节点
    中间节点:有一个或两个孩子
    叶子节点:没有子节点的节点
     
     
    前序遍历(先根序遍历):原理 根——>左——>右  先访问根节点,再访问左子树,在访问右子树
    中序遍历:                        原理 左——>根——>右  先访问左子树,再访问根节点,在访问右子树
    后序:                               原理 左——>右——>根  先访问左子树,再访问右子树,在访问根节点
    那么上图的前序遍历 :ABCDEFGHK        中序遍历:BDCAEHGKF 这里后序就不写了
    重点举例:中须遍历 
    1、先访问左子树 所以先排序 BCD。
    2、在BCD中 B节点为根节点 而不存在子节点 所以第一个就是B,而B的子节点是一棵树,所以在此暂时不对C进行排序
    3、当前C节点下有一个左叶子节点,按照(左根右)的排序规则,就应该是DC 那么联合B 目前的排序就是BDC
    4、在中序遍历中 先访问左子树 --->根节点----->右子树的规则,第四个就是根节点A   目前BDCA
    5、剩下EFGHK 这个节点组成的右子树,第一个E根节点下只有右节点而右节点是一颗树,所以只能排E这个节点  BDCAE
    6、F节点是棵树,而G作为F节点的左子节点也是颗树 无法排序,继续往下,H左叶子节点 OK就是它了  HGK 这个树就排好了
    7、剩下F 因为F作为根节点 排完左子树后就排根节点,所以现在就是F  HGKF 该节点没有右子树,所以将之前排序的合并 就是上面写的 BDCAEHGKF
     
    以下通过java 实现二叉树排序
    /**
     * 二叉树的遍历
     * 12 9 5 8 11 20  通过二叉树排序  增加一个规则如果加入的节点比本身节点小,那么放在左边否则放在右边
     * 第一步 将 12 作为根节点 
     * 第二步 由于 9<12 所以9作为根节点的左叶子节点
     * 第三步 5<12 放左边但左边已经有了一个左叶子节点 所以应该放 在9这个节点的下方作为左节点、
     * 同理后面也依次排序,最后二叉树如下:
     *           12
     *          /    
     *         9      20
     *       /    
     *      5     11
     *       
     *        8    
     * @author Administrator
     * 在java 中 treeMap 就是实现二叉树而提供的集合。
     * 博客地址:二叉树的理解  
     */
    public class Binary {
    
        private int data;
        private Binary left;    
        private Binary right;
        public  Binary(int i) {
            data=i;
        }
        public void add(Binary binary) {
            //根据之前的逻辑 就应该是将 当前传入的这个节点将本节点进行比较
            if(binary.data<this.data) {
                //如果left是null那么放在左边,否则就应该递归 放该左节点的子节点
                if(left==null) {
                    left=binary;    
                }else {
                    left.add(binary);
                }
                
            }else {
                //同上
                if(right==null) {
                    right=binary;    
                }else {
                    right.add(binary);
                }
            }
        }
        
        public void travel() {
            //中序遍历就是先左子树 在根节点 在右子树
            if(left!=null) {
                left.travel();
            }
            System.out.println(data);
            if(right!=null) {
                right.travel();
            }
            
        }
        //12 9 5 8 11 20 进行排序
        public static void main(String[] args) {
            Binary binary=new Binary(12);
            binary.add(new Binary(9));
            binary.add(new Binary(5));
            binary.add(new Binary(8));
            binary.add(new Binary(11));
            binary.add(new Binary(20));
            binary.travel();
        }
    
    }
     
  • 相关阅读:
    java 获取两个日期相差的毫秒数
    list 去重复
    java日期处理 calendar 和date
    CSS文字超出div或者span时显示省略号
    null类型的字段加1
    CSS或者JS实现鼠标悬停显示另一元素
    去除空格的js 和 使用正则表达式替换
    php preg_replace正则表达式除去<a>
    PHP页面编码问题
    用php生成09,az
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/9142163.html
Copyright © 2011-2022 走看看