浙大数据结构学习笔记

文章介绍了树的概念和作用,强调了其在数据管理中的查找操作,包括顺序查找和二分查找。接着详细讨论了二叉树的定义、形态、性质以及遍历方法,如先序、中序和后序遍历,并提到了非递归遍历和层序遍历。此外,文章还涉及二叉搜索树的操作,如查找、插入和删除。

一、什么是树

        (一)概念:客观世界中许多事物存在层次关系,这个层次关系就是树。

        (二)作用:提供分层次组织的思路,提高管理效率。

                >应用:数据管理的基本操作之一——查找

                    1.概念:根据某个给定关键字K,从集合R中找出关键字与K相同的记录。

                    2.静态查找:

                       查找√  插入❌删除❌

                      (1)顺序查找(法1)

                               a.要利用数组

                               b.用一个有两个分量的结构指针指向数组,表示 数组的头 和  数组容量    

                                c.技巧——哨兵:先将数组中下标为0的元素赋为K——>不需要判断下标为是否到达边界。

(无哨兵)

(有哨兵)

                                 d.返回的结果如果等于零,说明没找到K;不等于零,说明找到K,且知道了所在元素下标。

                                 e.时间复杂度为O(n),效率不高。

                      (2)二分查找(法2)

                                 a.伪代码

                                 b.时间复杂度为O(logN)

                                 c.二分查找必须首先进行数据有序连续化的处理,查找过程中会形成一种树形结构——判定树。树中结点表示当前判定的元素,所在层数表示该元素会在第几次被查到。

                                 d.平均成功查找次数ASL = (Σ结点的层次*当前层结点个数) / 结点总个数

                                  e.若不把数据放在数组里,而是直接以树这样层次化的结构存储数据,是否也能达到二分查找的效果?——>以树的一种形式存储我们需要的数据,是的我们的查找过程更加方便——>查找树(时间复杂度也为O(logN))[在树里插入和删除节点比在数组里方便得多]——>动态查找问题

                  3.动态查找:

                      查找√  插入√  删除√

二、树的定义

        空树(n=0)、非空树(n>0)、根、子树、树(子树不相交,每个结点有且仅有一个父结点,有N个结点的树有N-1条边)与非树、结点的度子树的个数树的度所有结点中最大的度数)、叶节点(度为0的结点)、树的深度所有结点中的最大层次)......

三、树的表示

对于

        1.用数组+链表的结构存数据。每个结点有指向子结点的指针,指针个数为树的度

 造成了2n+1个空间的浪费

2.儿子兄弟表示法每个结点的结构统一,都有两个指针,一个指向第一个儿子,另一个指向儿子的下一个兄弟。

 

 ——倾斜45°——>

——>每一个结点都有两个指针,一个指向左边一个指向右边,每个结点最多有两个儿子

——>二叉树(度为2的树)

 四、二叉树

(一)定义:一个有穷的结点的集合(可以为空)

(二)五种基本形态

 (a.空树      b.只有一个结点     c.只有一个左子树,右子树为空    d.只有一个右子树,左子树为空   e.左右两边都不空,有两个子树)

(三)!!二叉树的子树有左右之分

(四)特殊二叉树

        斜二叉树完美二叉树(满二叉树)(除叶结点外,每个结点都有两个儿子,而且叶结点都在同一层)、完全二叉树(每个结点同样必须有两个儿子,也就是,存在的每个结点都是满的,都有两个儿子)。

        (完美二叉树是完全二叉树,完全二叉树不一定是完美二叉树)

 (五)重要性质

        3.n0=n2+1

        证明:树中边的个数为结点数减一:

                                                        树中边数=n0+n1+n2-1 ①

                   度为0的结点给树中边的个数贡献为0,度为1的结点贡献值为1,度为2的贡献2:

                                                        树中边数=0*n0+1*n1+2*n2  ②

                   由①=②得n0=n2+1

(六)二叉树相关操作

 

(七)二叉树常用的遍历方法

        1.先序:根左右

        

        对于,遍历的顺序为:A (B D F E) (C G H I)

        2.中序:左根右

        

         对于,遍历的顺序为:(D B  E F) A (G H C I)

        3.后序:左右根

        

          对于,遍历的顺序为:(D E F B) (H G I C) A

        >可以发现

        每种遍历顺序都沿着同一条路径,每个节点我们会路过三次,不同之处在于"print"结点的时机(访问各结点的时机)不同

        

        先序:第一次路过时就访问;    中序:第二次路过时访问;    后序:第三次路过时访问

        注意,叶结点的三次是连着的。

         >上面的三种遍历方法主要是递归遍历,根本上的实现方法还是用堆栈,所以,有没有一种可能直接用堆栈实现三种顺序的遍历。——>二叉树的非递归遍历

(八)二叉树的非递归遍历

1.利用堆栈遍历

(1)中序遍历的非递归遍历算法

(2)先序遍历的非递归遍历算法

2.利用队列遍历

——层序遍历

(1)前情提要:

二叉树遍历的核心问题:二维结构的线性化。对同样一个二维结构,用不同的遍历方法会产生不同的序列。

那么二维变一维的难点在哪?——>在遍历二叉树这个二维结构时,访问左右儿子的前提是访问到它们的父亲。那么对于一个结点,在访问它的一个儿子时,另一个怎么办,或者它自己怎么办,我们不能把它扔掉,要想办法把自己(这样至少能通过自己找到另一个儿子)和儿子保存起来——>怎么保存呢?——>需要一个存储结构保存我们暂时不访问的结点——>堆栈or队列(二者均可实现算法的非递归遍历)

(2)层序遍历:根节点入队——>结点出队,访问该结点,该结点左右儿子入队(循环)

对于

操作过程:

各结点被访问的顺序为:

 

程序:

 

3.二叉树遍历的应用

        (1)输出二叉树中的叶子结点

        (先序遍历+ if语句)

         (2)求二叉树的高度

         (后序遍历)

        (3)二元运算表达式树及其遍历

 !!若d,e的根结点为+,f的根结点为*,中缀表达式变为:a+b*c+d+e*f*g,改变了原来的值。

 所以,中缀表达式会受到运算优先级的影响。

        (4)由两种遍历序列确定二叉树

          · 两种遍历中,只要有中序遍历就能唯一确定一个树。

          以 先序+中序为例:

(九)二叉树的建立

        1.二叉搜索树的查找操作

        

         

 

         2.二叉搜索树的插入操作

        

         3.二叉搜索树的删除操作

        

 

PS:

>本文章用于个人学习记录

>更新日志:2023.5.3.更新:重要性质三的证明,三种常用遍历方法

                    2023.5.4.更新:用队列实现层序遍历

                    2023.7.28更新:平衡二叉树

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值