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

    一、为什么用二叉树,而不是三个指针域或是根据实际情况指定指针域?

    比如3,那么有n个节点就是有3n个指针域,其中边只有n条,那么只有n-1个域非空,有2n+1个域为空,浪费空间。而对于2,那么就只有n+1个域为空。而比如说根据实际来确定指针域,对于实现上是非常困难的。

    度为2的树就是二叉树。

    斜二叉树/完美二叉树(满二叉树)/完全二叉树(是建立在满二叉树的基础上的树,补齐后就是满二叉树,否则顺序不一致就不是完全二叉树)

    二、二叉树特性

    1.每层节点个数为当前层数的2的幂次。2的k次方。

    2.深度为k的二叉树最大节点数:2的k次方减去1。

    3.对于任何非空二叉树,叶子节点的个数等于度为2的非叶节点个数加1。(通过查看树的边的个数,n0,n1,n2分别为节点数为012的节点个数,有公式:n0+n1+n2-1=0*n0+1*n1+2*n2=====》推算出:n0=n2+1)

    4.树的遍历方法:先序,中序,后序,层次遍历。

    三、二叉树的存储结构:

    1.顺序存储结构

      完全二叉树:由上而下从左到右存储n个节点的完全二叉树的节点父子关系:

    非根节点的父亲节点序号为:i/2(i>1)

    节点的左孩子:2i(2i<=n,否则没有左孩子)

    节点右孩子为:2i+1(2i+1<=n,否则没有右孩子)

    一般二叉树可以采用这种通过数组来存储的顺序存储结构,但会造成空间的浪费。

    2.链表存储

    class TreeNode{

    Object Data;

    BinTree Left;

    BinTree Right;

    }

    四、二叉树的遍历:

    1.先序遍历

    遍历过程:根节点---》左子树-----》右子树

    2.中序遍历:先递归左子树------》根节点----》遍历右子树======》(注意访问过程中的非根节点访问依旧按照此顺序)

    3.后序遍历:左子树---》右子树---》根节点

    这三种遍历都是在一条线路上只是遍历的起始位置不同

    上面的也是用递归思想来遍历的。

    二叉树的非递归遍历:

                  中序遍历非递归遍历算法: 堆栈

        遇到节点就压如栈,并比哪里它的左子树 ,当左子树遍历结束,从栈顶弹出并访问它,然后按右子树再去中序遍历该节点的右子树

     注:层序遍历是通过队列老实现的。将遇到的所有节点的依次右子树放入队列,然后按先进先出的原则,一次提取并访问它的子树,还是按上述原则一次将数据放入队列中。就可以实现层序遍历。

    实现应用:输出叶子节点,可以通过遍历中的加入if判断语句,是否有左右子树,如果没有就是叶子节点。

                      高度,二叉树高度等于左右子树最大高度加1。递归方法求左右子树高度,判断最大值然后加1.

                      二元运算表达式树和遍历,

                       确定一个二叉树:先序遍历和中序遍历可以,但先序和后序不能确定。

    树的同构:如果两个树通过若干次左右孩子互换,就可说这两颗树是同构的。

         二叉树的表示,建立二叉树,同构判别:

    二叉树表示:链表和数组(按完全二叉树的思路来表示)静态链表)

  • 相关阅读:
    linux ------ 使用 TFTP 在两个主机之前传输文件
    linux c 编程 ------ 串口编程
    Qt error ------ qRegisterMetaType() 跨线程信号与槽的形参携带
    Qt error ------ 'XXX' has not been declared
    Qt ------ 自定义QVector<T>中的T
    Qt ------ WAV 音频文件介绍
    short、int、long、float、double区别
    tinyint、smallint、bigint、int 区别
    String、StringBuffer与StringBuilder的区别
    equals与hashcode区别
  • 原文地址:https://www.cnblogs.com/plas/p/10023292.html
Copyright © 2011-2022 走看看