C++数据结构_树的理论学习笔记(1)_基本概念和基本操作

        前言:树型结构是一类重要的非线性结构,其特点是结点之间有分支,并具有层次关系。

1.1 基本概念

1.1.1 树

        树是由n(n≥1)个有限结点组成的一个具有层次关系的集合, 把它叫作“树”是因为它看起来像一棵倒挂的树,也就是说树是根朝上,而叶朝下的。如图所示:
在这里插入图片描述
        它具有以下的特点:
            ① 每个结点有零个或多个子结点;
            ② 每个子结点只有一个父结点;
            ③ 没有前驱的结点为根结点;
            ④ 除了根结点外,每个子结点可以分为许多个不相交的子树。

        为方便描述树的特点,先列出将会涉及到的树的基本概念
            ①结点的度:一个结点含有的子树个数;
            ②树的度:一棵树中,最大的结点的度;
            ③叶结点(终端结点):度为0的结点;
            ④分支结点(非终端结点):度不为0的结点;
            ⑤孩子结点:一个结点的子树的根结点;
            ⑥双亲结点(父结点):在含有孩子的结点中,该结点称为孩子结点的双亲结点;
            ⑦兄弟结点:具有相同双亲的结点;
            ⑧祖先节点:从根到该结点所经分支上的所有结点;
            ⑨子孙结点:以某结点为根的子树中任意结点;
            ⑩节点的层次:从根开始定义,根为第一层,根的孩子为第二层,以此类推。如下图所示:
                在这里插入图片描述
            ⑪树的高度(深度):树中结点的最大层次;
            ⑫路径:从根结点到某一结点的一条通道;
            ⑬路径长度:路径经过的边的个数。如下图所示:
                在这里插入图片描述

1.1.2 二叉树

        1.综述:二叉树是每个结点最多有两个子树的有序树,通常子树的根被称为“左子树”和“右子树”。如下图所示。二叉树是一种最简单的树结构,任何树都可以简单转换为二叉树。
            在这里插入图片描述
        2.树和二叉树的区别
            ①树的结点个数至少为1,而二叉树的结点个数可以为0;
            ②树中结点的最大度数没有限制,而二叉树结点最大度数为2

        3.两种特殊的而二叉树
            (1)满二叉树
                满二叉树中所有的叶节点都在最后一层,而其他分支结点的度数都为2。示例如下:
                    在这里插入图片描述
            (2)完全二叉树
                若一个二叉树扣除其最后一层后变成一个满二叉树,且最后一层的所有结点都向左靠齐,则称该二叉树为完全二叉树。示例如下:
                    在这里插入图片描述
            ★满二叉树一定为完全二叉树,完全二叉树不一定为满二叉树

        3.二叉树常见的性质
            性质1    一颗非空二叉树的第i层上最多有2i-1个结点(i≥1)
            性质2    深度为h的二叉树最多有2h-1个结点(h>1)
            性质3    对于任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
            性质4    若一个正则二叉树(只有度为0和2结点的二叉树)中有n个叶子结点,则该二叉树结点总数为log2n(由 性质2 推导)
            性质5    对于具有n个结点的完全二叉树,如果如果按照从上到下、同一层次上的结点按从左 到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于序号为i的结点,有
                ① 如果i>1,则序号为i的结点其双亲结点的序号为[i/2] ([i/2] 表示对i/2的值取整); 如果i=1,则结点i为根结点,没有双亲
                ② 如果2i>n,则结点i无左孩子(此时结点i为终端结点);否则其左孩子为结点2i
                ③ 如果2i+1>n,则结点i无右孩子;否则其右孩子为结点2i+1

1.1.3 森林

        由m(m≥0)棵互不相交的树构成的集合称为森林。如下图所示,该森林由三棵树所构成:
            在这里插入图片描述

1.2 基本操作

1.2.1 树的遍历

        1.前序遍历
            ①访问根结点;
            ②按照从左到右的顺序前序遍历根结点的每一棵子树。
        2.后序遍历
            ①按照从左到右的顺序后序遍历根结点的每一棵子树;
            ②访问根结点。
        3.层序遍历(广度遍历)
            从树的第一层(也就是根结点)开始自上而下逐层遍历,每一层按照从左到右的顺序逐个访问结点。

    下图展示了按照这三种遍历方式所对应的遍历结果:
        在这里插入图片描述

1.2.2 二叉树的遍历

        1.前序遍历
            ①访问根结点
            ②前序遍历访问根结点的左子树
            ③前序遍历访问根结点的右子树
        2.中序遍历
            ①中序遍历访问根结点的左子树
            ②访问根结点
            ③中序遍历访问根结点的右子树
        3.后序遍历
            ①后序遍历访问根结点的左子树
            ②后序遍历访问根结点的右子树
            ③访问根结点
        4.层序遍历
            按照从上到下,同一层次从左到右的顺序访问二叉树

        下图展示了一棵二叉树四种遍历方式的结果:
            在这里插入图片描述
    ★由二叉树的前序(后序)序列和中序序列可以唯一确定一棵二叉树,但是只由前序序列和后序序列不能确定一棵二叉树

1.2.3 森林的遍历

        1.前序遍历
            若森林非空,则:
            ①访问森林中第一棵树的根结点
            ②前序遍历第一棵树中根结点的每一棵子树
            ③前序遍历除第一棵树外的其他树
        2.后序遍历
            若森林非空,则:
            ①后序遍历第一棵树的根结点的各个子树
            ②访问第一棵树的根结点
            ③后序遍历除第一棵树外的其他树

        下图给出了一个三棵树的森林的两种遍历结果:
            在这里插入图片描述
        ★根据森林,树和二叉树的关系,可以得知:
            ①前序遍历森林前序遍历该森林对应的二叉树
            ②后序遍历森林中序遍历该森林所对应的二叉树
            ③前序遍历树前序遍历该树所对应的二叉树
            ④后序遍历树中序遍历该树所对应的二叉树

1.2.4 树、森林和二叉树的转换

        1.树、森林转换成二叉树
            ①在所有兄弟之间加一条线
            ②对每个结点,去掉该结点和除长子外与其他孩子的连线
        树转换为二叉树如下图所示:
            在这里插入图片描述
        森林转换成二叉树如下图所示:
            在这里插入图片描述
        2.二叉树转换成树、森林
        若结点x是双亲y的左孩子,则把x的右孩子、右孩子的右孩子都与y连起来,最后去掉双亲到右孩子的连线。如图所示:
            在这里插入图片描述

后置:C++数据结构_树的理论学习笔记(2)_存储结构,二叉树的实现

原创文章 11 获赞 10 访问量 1583

猜你喜欢

转载自blog.csdn.net/weixin_45817309/article/details/105699467