数据结构 之 二叉树

Posted CallBack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 之 二叉树相关的知识,希望对你有一定的参考价值。

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

而二叉树是一种特殊的树形结构。常用与二叉树排序的应用。
二叉树的定义:  每个结点最多有两个子树的结构称为二叉树。所以两个分叉可以分别称为左子树和右子树
根节点:每棵树中只有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数据结构与算法之二叉树遍历

数据结构之二叉树

python 数据结构之二叉树

风哥带你手撕算法之吃透二叉树(初版)

[DataStructure]非线性数据结构之哈希表二叉树及多叉树 Java 代码实现