当前位置 博文首页 > XSES_yasuoman的博客:数据结构——树与二叉树

    XSES_yasuoman的博客:数据结构——树与二叉树

    作者:[db:作者] 时间:2021-08-31 22:22

    数据结构——树与二叉树

    树的基本概念

    树的定义

    见王道书P119


    树的性质?

    • 结点数 = 总度数(分支数) + 1,这个 1 是根结点。

    • 度为 m 的树m 叉树
      任意结点的度 <= m任意结点的度 <= m
      至少有一个结点度 = m允许所有结点的度都 < m
      一定是非空树,至少有 m + 1 个结点可以是空树
    • 度 为 ? m ? 的 树 、 ? m ? 叉 树 , 第 ? i ? 层 至 多 有 ? m i ? 1 ? 个 结 点 \begin{array}{l} 度为\ m\ 的树、\ m\ 叉树,第\ i\ 层至多有\ {m^{i - 1}}\ 个结点 \end{array} ?m??m??i??mi?1??

    • 高 度 为 ? h ? 的 ? m ? 叉 树 、 m 度 树 至 多 有 ? ( m h ? 1 ) ( m ? 1 ) ? 个 结 点 ( 等 比 数 列 求 和 ) \begin{array}{l} 高度为\ h \ 的\ m \ 叉树、m 度树至多有\ \frac{{({m^h} - 1)}}{{(m - 1)}}\ 个结点(等比数列求和) \end{array} ?h??m?m?(m?1)(mh?1)???

    • 高 度 为 ? h ? 的 度 为 ? m ? 的 树 至 少 有 ? h + m ? 1 个 结 点 ( 等 比 数 列 求 和 ) \begin{array}{l} 高度为\ h \ 的度为\ m\ 的树至少有\ h + m - 1 个结点(等比数列求和) \end{array} ?h??m??h+m?1?

    • KaTeX parse error: Undefined control sequence: \ at position 43: …点的\ m\ 叉树的最小高度为\? ?\left\lceil {{{…



    二叉树

    二叉树的定义和主要特性

    在这里插入图片描述
    注意以上都是向下取整

    在这里插入图片描述

    在这里插入图片描述

    二叉树的性质?

    KaTeX parse error: Unknown column alignment: * at position 789: …{\begin{array}{*?{20}{c}} {{n_0}…


    二叉树的存储结构和基本操作

    顺序存储

    满二叉树和完全二叉树可以采用顺序存储

    同“串”一样,我们从下标 1 开始存储,方便对应。

    #define MaxSize 255
    ElemType data[MaxSize];
    

    基本操作

    在这里插入图片描述


    顺序存储——非完全二叉树

    对于非完全二叉树,则不能使用上述只用一个数组搞定的方式,而是要借助结构体来完成定义:

    struct TreeNode{
        ElemType value;
        bool isEmpty;
    };
    TreeNode data[MaxSize];
    

    很浪费空间!


    链式存储

    // ElemType 可以是一个结构体哈!长见识了吧!
    struct ElemType{
        int value;
    }
    
    typedef struct BiTNode{
        ElemType data;
        struct BiTNode *lchild, *rchild;
        Struct BiTNode *parent;		// 考研中经常考没有这个指针的情形,有这个叫做“三叉链表”
    }BiTNode, *BiTree;
    
    • iTNode 强调结点,BiTree 强调树。
    • n 个结点,有 2n 个指针域,有 n - 1 个结点被某个结点指向,因此有 2n - (n - 1) = n + 1 个空指针域(也可直接计算空指针域个数: 2n0+n1 = 2n2 + 2 + n1 = n + 1 来推导),n + 1 个空指针域可用于构造线索二叉树。


    初始化

    struct ElemType{
        int value;
    }
    
    typedef struct BiTNode{
        ElemType data;
        struct BiTNode *lchild, *rchild;
    }BiTNode, *BiTree;
    
    // 初始化:
    BiTree root = NULL;
    
    // 赋值:
    root = (BiTNode *)malloc(sizeof(BiTNode));
    root -> data.value = 1;
    root -> lchild = NULL;
    root -> rchild = NULL;
    



    二叉树遍历

    时间复杂度为 O(n),空间复杂度为 O(h + 1) 1 指的是最后一层的空结点

    先序遍历

    void PreOrder(BiTree T){
        if (T != NULL) {
            visit(T);
            PreOrder(T -> lchild);
            PreOrder(T -> rchild);
        }
    }
    

    中序遍历

    void InOrder(BiTree T){
        if (T != NULL) {
            PreOrder(T -> lchild);
            visit(T);
            PreOrder(T -> rchild);
        }
    }
    

    后序遍历

    void PostOrder(BiTree T){
        if (T != NULL) {
            PreOrder(T -> lchild);
            PreOrder(T -> rchild);
            visit(T);
        }
    }
    


    求二叉树的深度

    int treeDepth(BiTree T) {
        if (T == NULL)
            return 0;
        else {
            int l = treeDepth(T -> lchild);
            int r = treeDepth(T -> rchild);
            // 树的深度 = Max(左子树深度,右子树深度) + 1
            return l > r ? l + 1 : r + 1;
        }
    }
    



    树、森林





    树与二叉树的应用








    cs