数据结构---树和二叉树01

树和二叉树

         目录

一、名词解释

    1.树的度

  二、树的表示法

    1.双亲表示法

    2.孩子表示法

    3.双亲孩子表示法

    4.孩子兄弟表示法

  三、二叉树

    斜树

    满二叉树

    完全二叉树

    二叉树的存储结构


一、名词解释

    1.树的度

        任意子树拥有的子树节点的个数的最大值。

  二、树的表示法

    1.双亲表示法

        以数组储存形式为例:时间复杂度=O(1)

        结构体内包括{1.内容;2.双亲(Parent)指针}

图源小甲鱼
图源小甲鱼

        两种拓展形式,只需增加结构体之中的内容。插入兄弟(Sib)指针或子(Child)指针。

        注意: 1.根(root)的双亲指针为 -1。

                    2.兄弟指针特指在同一子树内部的右边的兄弟指针。

    2.孩子表示法

                1.根据树的度,声明足够空间存放子树的节点(大量浪费空间)。

                2.根据子树的数量,声明空间存放子树的节点(大量浪费时间)。

                3.类链表形式表述:

图源小甲鱼

    3.双亲孩子表示法

        结构体内既包含双亲(Parent)指针,又包含孩子(Child)指针。

图源小甲鱼
#define MAX 100

struct Data
{
    int data;
};

//孩子节点(上图中的右侧孩子)
typedef struct CTNode
{
    int child;                  //孩子节点的下表
    struct CTnode* next;        //指向下一个孩子节点的指针
}*ChildPtr;

//表头结构(上图中的左侧每一行)
typedef struct
{
    struct Data data;           //数据
    int parent;                 //存放双亲的下标
    ChildPtr firstchild;        //指向第一个孩子的指针
}CTBox;

//树结构(上图中的左侧整个矩阵)
typedef struct
{
    CTBox nodes[MAX];           //节点数组
    int r,n;
};

    4.孩子兄弟表示法

  三、二叉树

        性质:1.在二叉树的第i层上至多有2^{(i-1)}\ (i\geq 1)个节点。

                   2.深度为k的二叉树至多有(2^{k}-1)\ (k\geq1)个节点。

                   3.对于任何一个二叉树T,如果其叶节点数为n_{0},度为二的节点数为n_{2}

                      则n_{0}\ =\ n_{2}\ +\ 1

        注意:1.每个节点最多两个子树。

                   2.左子树和右子树有顺序不能颠倒。

                   3.某个节点只有一个子树也要区分它是左子树还是右子树。

二叉树的五种形态     图源小甲鱼

    斜树

        如上图中的左2、左3。

    满二叉树

        所有分支节点都既有左子树,又有右子树,并且所有叶子都在同一行上(最下一层)。

图源小甲鱼
图源小甲鱼

    完全二叉树

         性质: 1.具有n个节点的完全二叉树的深度为\sqsubset \log_{2}n\sqsupset \ +\ 1\ ,\sqsubset \sqsupset为向下取整

                     2.对于1中的完全二叉树,把节点按照层序编号(第一层为1、第二层为2 ......)

                          2-1.如果i\ =\ 1,则节点i是二叉树的根,无双亲;

                                如果i\ > \ 1,则其双亲是\sqsubset \frac{i}{2}\sqsupset

                          2-2.如果2i\ > \ n,则节点i无左孩子(节点i为叶子节点)

                                如果2i\ \leq \ n,则其左孩子是节点2i

                          2-3.如果2i\ +\ 1\ > \ n,则节点i无右孩子

                                如果2i\ +\ 1\ \leq \ n,则其右孩子是节点2i\ + \ 1

        1.叶子节点只能出现在最下层。

        2.最下层的叶子只能集中出现在左部连续位置。

        3.倒数第二层,若有叶子节点,一定出现在右部连续位置(同2)。

        4.如果节点度为1,则该节点只有左孩子。

        5.同样节点数的二叉树,完全二叉树的深度最小。

图源小甲鱼

                注意:满二叉树一定是完全二叉树,反之不一定。

    二叉树的存储结构

                顺序存储结构:运用完全二叉树的思想(实际操作中我们所用的树不是二叉树),将不存在的节点用空指针(^)表示。(若是斜树,则冗余多)

                链式存储结构:存储指向两个孩子的指针

typedef struct BiTNode
{
    struct Data data;         \\数据域
    struct BiTNode *lchild;   \\指向左孩子的指针
    struct BiTNode *rchild;   \\指向右孩子的指针
}BiTNode, *BiTree;

                

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LXTTTTTTTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值