数据结构-树与二叉树

本文详细介绍了树的基本定义、术语,包括度、双亲、后辈等,以及树的度数与结点数的关系。接着,文章探讨了二叉树的定义、主要特性和存储结构,包括满二叉树、完全二叉树和平衡二叉树。还深入讲解了二叉树的遍历方法,如先序、中序、后序遍历,并介绍了线索二叉树的概念。此外,文章还涉及了二叉排序树的插入、删除操作以及平衡二叉树的重要性。
摘要由CSDN通过智能技术生成

1.1 树的定义

        1)数的定义是递归的,在定义树的过程中,又用到了树的定义

        2)树有且仅有一个特定的称为根结点的结点

        3)树的根结点没有前驱,除根结点外的所有结点有且仅有一个前驱

        4)树的所有节点可以有零个或多个后继

        5)含有n个结点的树中,有n-1条边,每条边连接两个树结点

1.2 基本术语

        1)隔层的称为长辈、祖先、后辈、子孙;不隔层的称为长辈、双亲、后辈、孩子;双亲相同即为兄弟、双亲不同,但双亲在同一层的即为堂兄弟

        2)树中一个结点的孩子的个数称为该结点的度,树中节点最大的度称为该树的度

        3)度大于零的结点称为分支结点,又称为非终端节点;度等于零的结点称为叶子结点,又称终端结点

        4)树的深度是从根结点开始,自顶向下逐层累加的;树的高度是从叶子结点开始自底向上逐层累加的,且仅取树中结点的最大高度

        5)树中结点的各子树从左到右是有次序的,不能互换,称该树为有序树,反之即为无序树

        6)两结点间的路径,即为两结点之间所经过的结点构成的序列,路径长度即为路径上所经过的边的个数。注意树中的路径是有向的,从上而下的,例如同一双亲的两个孩子之间不存在路径

        7)森林,有m颗互不相交的树构成。森林和树很类似,将树的根结点去除,即变为了森林;反之,为森林加上根结点,即变为了树

        8)树中的结点数等于所有结点的度数之和加一

        9)度为m的树,第i层上至多有m^(i-1),即每个结点的度均为m,这样第二层有m个结点,第三层有m^2个结点,以此类推得上式;度为m不能说明某层结点一定为m个,因为度是指某个结点的孩子结点数量为m

        10)度为m、高度为h的树,至多有(m^h-1) / (m-1)个结点,即每个结点度均为m,这样第二层有m个结点,第三层有m^2个结点,由等比数列求和可得上式;至少有h-1+m个结点,即除了某个结点的度为m,其他结点的度均为1

        11)度为m、结点数为n的树,最小高度为logm (n(m-1)+1)向上取整,即设高度为h,当每个结点度均为m时,用h表示当前树的结点数,另其等于n,反向求解出最小高度;最大高度为n-m+1,即除了一个结点度为m,其余结点度均为1

        12)每个度对应一个分支,度的和即为分支和;总结点数=分支+1,即分支数量加上一个根结点;总结点数也可以表示为各个结点之和,当知道度为m的树中,度为0的结点数、度为1的结点数、、、即可知总结点数

2.1 二叉树的定义及其主要特性

        1)二叉树是每个结点至多只有两棵子树的树,且二叉树存在左右之分,顺序不能任意颠倒,即使二叉树仅存在一个结点,也需要区分该结点的左右

        2)度为2的树至少有三个结点,但二叉树可以为空;度为2的树孩子的左右顺序是相对于另一个孩子而言的,当某个结点只有一个孩子时,也就不需要考虑孩子的左右顺序,但二叉树即使只有一个结点也需要考虑结点的左右顺序,即二叉树的左右顺序是绝对的,确定的

        3)满二叉树即指高h,结点数为2^h-1个的二叉树;完全二叉树即满二叉树少了最下层最右侧的部分叶结点的树;平衡二叉树即任意结点的左右子树高度差不超过1;二叉排序树即左子树的关键字均小于根结点,右子树的关键字均大于根结点的树

        4)对于满二叉树,结点 i 若有双亲,则双亲为i/2向下取整;若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1(均可通过数学归纳法证明)

        5)对于完全二叉树,若结点i<=n/2向下取整,则该结点为分支结点,反之则为叶结点叶子;叶子结点只能在最后两层出现;若存在度为1的结点,则该结点只能有一个,且一定只有左节点;结点i所在层次为log2 (i+1)向上取整,或(log2 i)+1向下取整

                证明:

                对于结点n,设其深度为k,一定存在2^(k-1)-1<n<=2^k-1,或2^(k-1)-1<=n-1<2^k-1对不等式两边同时做恒等变换,得2^(k-1)<n+1<=2^k  ==>  k-1<log2 (n+1)<=k,这样即得上述一式;2^(k-1)-1<=n-1<2^k-1  ==>  k-1<=log2 n<k,这样即得上述二式子

2.2 二叉树的存储结构

        1)顺序存储指用一组地址连续的存储单元依次自上而下,自左而右存储完全二叉树上的结点元素

        2)根据二叉树可以知道,满二叉树和完全二叉树采用顺序存储较好,此时既可以保持二叉树的特殊性质(这样就可以通过数组下标反应不同结点间的关系,如下标4和下标8显然是双亲结点和对应的左孩子结点),也可以有效利用存储空间,但与之对应的,一般二叉树为了能够维持二叉树性质和数组下标的联系,需要添加一系列不存在的结点,这些结点对应完全二叉树上的结点

        3)树的顺序存储,数组下标要从1开始

        4)链式存储代码实现

typedef struct BiTNode{
    Elemtype data;    //数据域
    struct BiNode *lchild, *rchild;    //指针域,指向左右孩子
}BiTNode; *BiTree;    //区分结点和树

        5)链式存储中,含有n个结点的二叉链表,含有n+1个空链域,因为每个结点都会占用自身的数据和指向该节点的一个指针域(根结点除外,其只会占用数据域),故链域总数为3n,被占用的链域为2n-1,则空链域为3n-(2n-1)=n+1

2.3 重难点解析

        1)分枝数等于度数,结点数等于度数加一

        2)完全二叉树最后一个分支结点为n/2向下取整,知道n就知道分支结点的个数

        3)完全二叉树的n1只能是0或者1,最后一层的结点数为奇数则为1,为偶数则是0

        4)高为h的完全二叉树中,h-1层一定是满二叉树,若知道h层的叶子结点数量,是可以直接算出结点总数的

        5)对于m叉树的相关求解,要灵活利用m叉树的特点,若结点i在n层,双亲在n-1层,则i的位序是n-1层m叉树的结点总数加其在n层的位序k,以此可以反向求解k,当得到k后,易得双亲的位序(此处需要格外注意,双亲结点并不应该用n-2层结点总数加上k/m向下取整,因为当k为m的整倍数时,该算法会出错)

        6)求解最近公共祖先结点的题目中,要注意初始的两个结点可能并不在同一层,要让层次更高的结点先向上寻找祖先结点

        7)要使树最高,则尽可能每个结点度最少(同时应满足题设)

        8)要使树最低,则尽可能每个结点都满度(叶子结点除外)

3.1 二叉树的遍历

        1)先序遍历

                访问根结点、先序遍历左子树、先序遍历右子树

vodi PreOrder(Bitree T){
    if(T!=null)    //验证树是否已经遍历结束,遍历结束最后结点为null
        visit(T);    //这里仅仅是代指,事实上visit往往有具体的实现方式
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值