好,本节课的最后一个知识点是关于二叉数的线索化。二叉数的线索化是因为我们在二叉数的二叉链表的表示的时候,没有办法找到整个二叉数节点的前驱, 他的后继倒是比较容易找到,但是我们如果想要找到他的负解点的话怎么办呢?这里有几种解决方案,就是第一,我们可以通过便利来继续寻找,这种方法比较费时间。第二,我们可以再增设前驱后继指针来 进行先进一步的寻找,但是这种呢,整整个的一个存储容量就会增大,因为指针又要进行一个增射和进行一个开辟。第三,我们可以用二叉列表中的空指针语来进行表示。之前我们学过在 n 个节点的二叉列表 中有 n 加一个空指帧域,因为 n 个节点的二叉列表一共有二 n 个表,然后减去这个 n 减一,最终得到的是 n 加一个空指帧域。 我们以中序便利为例来看一下二叉数的线索化它的一个实线的过程,如果我们 对于空指人域进行一个有效合理的利用的话,可以用它来存放当前节点的直接前驱和后击等线索,以加快查找的速度。这里有几个基本的概念,首先就是线索,线索指的是二叉数整每一个节点的前驱 和后继与他自己的一个关系,换句话来说也就是指向节点前驱和后继的一个指针。第二就是线 锁的链表,线索的链表是加上线索的二叉链表。第三就是线索的二叉数,线索二叉数就是加上线索的二叉数, 比如这里就是一个典型的线索二叉数,而对二叉数以某种次序便利使其变为二叉线线索的过程就叫做二叉数的线索化。这里是一个中序的二叉数线索化。 简单来讲一下,这里的线索化到底是什么意思?比如说我们又增设了几个 指针,这里的指针指向的是他自己的一个前驱,因为 f 他的前驱是 a, 而 f 的后继是 c。 因此这样的两个指针,一个指向的是前驱,一个指向的是 它自己的后际。但是是不是每一个接连都可以用前驱和后际指针指向呢?并不是这样的,为了避免混淆,我们在二叉数的线左化的时候增加两个标志域,也就是左和右。 这样的话,我们整个的一棵树中的节点就包括了 date、 左右标志欲以及左右原本的一个孩子。 如果说节点有左子数,那么 l child 就指向其左孩子,否则这个 l child 就直接指向他的直接前驱,也就是我们找到的这一个线索。 同样的,如果说这个节点有柚子树的话,那么 are to child 就指向的是它的幼孩子,否则直接指向的是它的。 通过这样的一个定义,我们可以看到整个的一个二叉数线组化依然会是以孩子为主,也就是说,首先需要判断的是他到底有没有左子数和有没有幼子数。 这里我们对于这两个标志位,如果说左标志位等于零,那么 l t 指向的是左孩子。如果说左标志位等于一,表示的是指向其前区,也就是这个时候他没有孩子。同样的,如果右标志位等于零的话,证明这个 这个节点是有幼孩子的,而如果右边的标志位等于一的话,表明右边的孩子指向的是他的后继,那么这样直接来说的话呢,大家可能不太好理解,我们通过一个图示来跟大家具体的讲解。 这里是一个先序线索,二叉数有五个标志位,也就是孩子两个位于最外边,这里是两个标志位,左与右以及一个 dat, dat 已经被填充进去了,就是 a、 b、 c、 d、 e 这样的五个情况。先序序列 整个的一个二叉数,它的先序是 a、 b、 c、 d、 e, 也就是说 b 的前驱是 a, b 的后继是 c。 那么我们首先来看一下对于 a 节点而言,因为 a 是有孩子的,也就是 a 是有左孩子以及右孩子的, 在这种情况下,我们的 a 就没有办法对于这样的两个进行操作,也就是没有办法实现这个线索化,而是老老实实的指向了他的左右孩子。那么到达 b 结 点的时候就不一样了,因为毕节点左边是没有的,是没有孩子的,所以说左边这个指针原本意义上他是空的,现在我们就需要把这个空指针给利用起来, 利用起来的时候,左边指向的是他的前驱,而右边指向的是后继,这里 b 的前驱就是 a, 所以说我们用这个指针指向他的前驱。同时由于左边是没有孩子,所以把这个标志位置一即可。 当然他的右边我们也没有办法进行其他的操作,因为右边还有一个孩子,也就是 c 界点。 继续我们来看 d 结点跟 b 结点的情况正好相反, d 结点是有一个左孩子,但是没有右孩子,所以说右边指向的是它的后继,而 d 结点的 后记是这个 e 节点,也就是把右边的指向了 e 节点。同样的,我们来看一下 c 节点和 e 节点的操作。首先 c 节点以及 e 节点它都是没有孩子的,因此这两个指针它都是空的。 是空的情况下,我们就可以对这两个原本没空的指针进行一个合理的利用,用在这个线索二叉数上。 首先左边指向的是他的前驱,也就是 c 的前驱是这一个 b 结点左边至一,然后指向 b, 同时右边至一,指向的是他的后继,也就是 d。 那么对于 e 节点也是一样,左边至一指向他的前驱 d, 右边至一,那么右边 指向谁呢?右边这里很显然没有后继了,所以说我们先暂时把它置为一个空,那么这个空后边我们也有方法来解决它。 好,我们来看中序线索二叉数的情况,中序线索二叉数跟刚才我们先序的情况是一模一样的, 只不过对于序列的一个排序不同。但是对于线索以及指针的一个指向,就跟刚才的操作是一样的,比如说 c 和 e, 他们的前驱和后际分别是 a, 所以说 c 的这里后际指向 a, 而 e 的这里前驱指向 a。 中序线索二错,二叉数看起来就比刚才那个要更加对称一些,然后他的这里这个空是位于两边。 最后就是后续线索二叉数,这里就不再进行赘述了,大家通过这样的一个动图,也可以看到后续序列它的一个二叉数的指向, 那么了解了二叉数到底是一个怎么样实现之后,我们这里以中序线索化为例,来讲解一下二叉数的一个算法。首先我们将一个指针 prayer 指向刚访问过的节点,它的初值是一个空值, 这里的话,我们对于整个的二叉数进行线索化,是需要对左子数以及对这个右子数进行线索化,而线索化左子数和右子数的中间进行了哪些操作了?其实进行的是对于线索的一个确定,比如说这里是前 区线左,也就是左孩子指向的是前区,然后将左边的标志位置一,这里是右孩子指向的是后进,将右边的一个操作位置一, 最终还要将 player 指向当前的这个 p 节点作为 p, 将要指向下一个节点的前驱节点的提示指针。这里整个的一个过程也并不太复杂,就是说 这么两步是对于线索二叉数节点的一个标识,而这里是真正实线的地规操作,也就是左子数的线左画和右子数的线左画,我们只需要按照刚才对于地规的一个理解来进行书写就可以了。 而回到最开始的那一个问题,这里我们要画出以下二叉数对应的中序线索。二叉数的时候, 整个的一个中序便利的结果在途中是很容易得到的,因此我们画的时候也是画出他的前屈和后继。画出前屈和后继的时候,因为这里我们的这 它的后继已经没有了,而这里的 h 它的前驱也没有了。为了避免出现这种悬空状态,我们可以再增设一个头结点,这个头结点也就用来承接 h 的前驱和 j 的一个后继,我们看一下是怎么样实现的 好,还是刚才的这一棵二叉树。这里呢?我们就对于 h 以及对于 g 进行了一个具体的线索化的一个变形, h 的前驱 放在了这个新建的一个节点的左边,而这的后记我们也指向的是这个新建的节点。简而言之,我们就等于说是对于新生成的一个节点 rot, 他是 h 的前驱,也是 g 的这一个后继,这样的一个过程,简而言之,其实可以把它看作是一个循环的情况下,当然了这种情况也是为了让我们的这个线索二叉数整体的一个流程变得更加完整而已。
粉丝566获赞3812


好,我是豆芽,那今天呢,我们来画一个二叉数啊,一个数,然后我们点下,开始看下效果啊,你看我们画了一个苹果数是吧?很多很多苹果,那我们先把苹果去掉,我们看一下数是怎么画的。那等一下开始, 这个我们可以让他隐藏啊,你看我们画了一个五颜六色的竖,是吧?竖叉好,那有的同学觉得,嗯,感觉很麻烦是吧?但是呢,我们仔细观察,你会发现啊,我们的画笔它实际上只是在做一个重复的动作,一个什么动作呢?画一个竖叉是不是呀? 哎,你看一个歪,大写的歪字,然后在每一个歪的顶端呢,又画一个歪,在这个顶端再画一个歪,然后一直重复做这个动作啊,只是每一个歪的边长呢,越来越小,越来越短了。 那我们今天呢就要用到一个啊,我们在编程的时候啊,最常用啊,也是很重要的一个算法,叫做地规算法。 那什么是地规呢?我们说的通俗一点就是我们弄一个自制积木啊,我们在这个自制积木的啊,也就是这个函数啊,在他的内部呀,自己再去调用一次自己。那你看我在执行这个,这个,最后呢我再自己调用一下我自己, 那就像一个死循环一样啊,同学们啊,有没有发现啊?你看我执行他执行他,然后调用自己又回到这里,然后执行他,执行他又回调用他回到这里, 是不是就相当于是一个啊,重复执行啊,没有出口的重复执行。所以说呀,我们说地规,首先第一点啊,是当我们要电脑去重复执行一 一个动作的时候没有地规,第二点呢,就是我们一定要记得给他怎么样呢?设置一个出口。嗯,地规还是我们必须给他设置一个出口才行,如果没有出口就是一个啊, 重复执行了是吧?没有出口的重复执行,那我们后面的这一些积木是不是都不会执行了?永远不会执行。嗯,好,那我们现在来动手画这个数吧。首先呢啊,我把之前的代码都拆开。 嗯,好,我们现在呢弄了一个箭头做角色啊,来做我们的画笔,我们说画笔必须,我们要画,画的话必须要有,怎么样要有一个角色去做我们的皮上。好,那我们点击画笔,刚开始呢,我们要把画布全部 擦除。好,开始开始。嗯,好,全部擦除,然后给比一个初始位置, 从这里开始画是吧?然后要放在前面。好,然后呢,我们刚开始比要让他朝上,这也是出手画的一部分,朝上是年度 好,初始画完成了啊,点击开始比在这里啊,我们大小也可以设一下啊,这么大可以了,那我们首先呢,现在来画一个竖叉啊,就是一个歪字,大写的歪字。 刚开始我是不是比较先画第一笔朝上画一条竖线啊?那我们初次画已经说了面向零度朝上,那画竖线呢啊,我们还要落笔是吧?好, 落笔,然后朝上画多长呢?画个五十吧。嗯,好,画五十,点击开始啊,你看一条线画好了,然后我们要画第二笔,第二笔画左边的竖叉吧,第三笔,然后画右边的竖叉。那左边的竖叉怎么画呢? 是不是我现在要让画笔啊?现在是朝上的,我要让往左边画,要让他怎么样?左转是吧,左转多少度呢?我们大概是三十度。 左转三十度再移动啊移动,那我们的速差呢,是越来越短的吧。速干最长越来越短。那我们给他短多少呢啊?弄个四十五吧啊,每次减五, 你看刚开始我们下面是五十,那左边竖叉是四十五,我们点下开始。哎,左边竖叉画好了,那我们怎么画右边 出场了啊?我们可以模拟一下你在画画的时候,是不是在这个时候你会把笔抬起来,然后呢从这里移到这里再画。那我们这里呢啊,你可以抬笔啊,但是我们 觉得啊抬笔可能太麻烦了。我直接的话怎么样呀?原路返回是不是我画到这里来了,我让他原路返回,我不不需要抬了呀,是吧,直接回去 是不是也可以?嗯,那怎么原路返回?我们过去是移动四十五步,那回来呢?是不是移动四十五步 啊?还可以看一下效果,你看是不是跑到这里来了。好,现在开始画右边了,那我笔现在是朝左的。那我要掉一下头啊。往右转,右转多少度呢?我们本来是朝上的,我们朝左 转了三十度。那我现在往右转三十度是朝哪里的?是不是又回到朝上了?可是现在我要朝右边吧,所以我往右要怎么样?要多一点,两个三十度,那就是六十度。 好,再你看现在我的笔是朝左的吧,我等下开始是不是朝右了。好,再怎么样啊?直行这个画的移动四十五步,把这一节 拿过来啊,最后呢再倒回来移动负四十五步看一下。哎,右边也画好了,并且我的笔是不是倒回来了,那我们呢?啊,想要的是一个啊红,每画好一个竖叉后呀,我的笔最好能回到起点。嗯, 那我们回到最初的位置,怎么回呢?哎,我让笔,你看,现在他是朝右的,我让他往下倒,那我首先把他方向调 从朝上,是不是才可以?好,那我就要让他左转多少度呀?三十度。好,左转三十度,然后开始你看再往下面倒倒多少呀?负五十, 因为我们前面这里是五十步吧,那倒就倒负五十。好,你看一个竖叉画好了,并且我们的笔画完之后,是不是回到了起点位置?嗯,好,那怎么去画很多很多的竖叉呢? 哎,那我们可以这样先弄一个知识积木啊,叫做画竖叉,然后呢,我们要给他一个变量。啊,为什么呢?因为我们啊,可以发现刚才我们画竖叉的时候,这个竖叉是不是越来越小,越来越小,越来越短了呀?越往上面啊,那我们是不是 要有一个变化的量,一个变量去控制素材的大小才行,那么就叫长度吧。 好,点击完成,然后把从落笔开始呀,这一节代码,哎,就是画数叉的这一节代码全部移到这里来。 好,现在这个变量怎么搞呢?你看我们刚才啊,第一个竖叉长度设了五十步吧,那我要通过这个行叉去控制它,那我就要把这个长度放到这里来,五十步。那四十五改成什么呢?这个改成五十减五, 我让每个素材比上一个长度减五。啊,这里等会可以自具调一减五也可以,减六也可以,减十都可以,是吧,你看怎样画才好看啊?那我这里是减五, 那四十五呢?这里也是减五,那负四十五呢?一个负数我们可以怎么做呀?是不是可以用零减去它本身?比如说我是五十,我要变成负五十,那我拿零减去五十,是不是就是等于负五十呀? 所以我们用零减去这一节啊,就是负四十五了,再复制一个, 你看啊,当然我们也可以用负一去乘以那个数,也是吧。好,这里负是改成什么呢?直接是零减长度。 好,你看现在我们调用这个函数字体,我们需要给他一个时差,一个数弄成五十,那我们就是原来大小。那如果我们 写成一百呢?那大家可以看到这个竖叉是不是明显变大了,变长变成一百了,那这里减五就是九十五这一节。好,那我们现在先弄小一点,弄个四十吧。 好,这是我们的第一个竖叉。那怎么画很多很多竖叉呢?那我们可以注意到,刚才我们画竖叉的时候,是当我们画笔移到每一个竖叉的尖端顶两个顶端的时候,是不是在他的顶端的位置再去画一个小的竖叉才行啊? 比如说在这个位置再去怎么样调用一下,还是说自己再画一个竖叉,那我们得找一下在这个位置是什么时候呢?你看我们首先移动,是吧?往上面画一步啊,跑到这里来了,然后呢?左转啊,到这里左转再移动啊, 移动跑到这里,是不是在这个位置移动的时候,在这个中间是跑到左边的顶端了?好,然后回来右转,然后在这个位置是跑到右边的顶端了,那我让他在左边的顶端再画一个竖叉,在右边的顶端也画一个竖叉 啊,最后这个竖叉呢要越来越短,那我们每次长度减五,这里长度减五, 是不是素材越来越短了?你看这样哎,可以了吗?这样我们看下效果,哎,出现问题了。 好,那我们之前说过在使用定规算法的时候一定要记得干嘛呀?要记得给他设置出口才行。那如果我们不设置出口,他就会像现在这样啊乱画,你看他直行移动,然后呢?左转,再移动,然后调用自己 啊,回来再移动,左转,再移动,又调用自己,他就一直移动,左转移动左转移动左转移动左转移动左转,然后到了这个位置的时候呢,当我们的速度,哎,你看每次都是减五吧,当我们的长度变成零的时候 啊,零再减五,变成负五了,他就往相反的方向变成负数了,反的方向,然后这样运动啊就会乱发。所以我们这里呢啊要给他设置一个出口。怎么设置呢?你看我们的长度是不是越来越小了?那我加一个判断啊,我说了如果 我的长度呢啊用一个小鱼,我说如果我的长度小于二十五了,那你看我们原来是四十啊,这里呢每一次减五,那我花了个三成吧,是吧?三五一数四十,减一数二十五, 我们每次呢啊,我们说小于二十五了,我就干嘛呢?停止这个脚本,哎,在这里停止是这个脚本,不是全部脚本,停止完这个脚本。好,那我们是不是到了二十五的时候小于二十五的时候就不会再画了?我们看一下开始, 哎,一个数就画好了,是吧?好,可能有些同学我这样写,他不是很懂什么意思,为什么要放到这里呢?为什么要这样写呢?那我们换一个说法, 我们这样做,我们限制是,现在是要限制谁啊?限制这一个代码吧,我不能让他无限的往左边画, 那我给他加一个条件是不是就可以了呀?加个什么条件呢?我说呀,当我的长度大于二十五,哎,我们要花到二十五,那我们现在 写二十四吧,是吧,这样才能包括二十五自己吗?这样就啊,二月二十四才包括二十五本身吧。我说长度大于二十四的时候才会画这个竖叉,那现在小于二十四了,别人比如说等于二十的时候,他还会执行吗? 是不是不会执行这个代码了,那他就会跳过他执行后面的代码,也就是会画右边的竖叉了。哎,同样的道理,那这个地方我们是不是也要给他套一个才行? 哎,我在他的外面加一个判断去限制他,那我们看一下什么效果, 哎,开始是不是和刚才是一样的呀?哎,这样我们一个基础的一个竖插就画好了。那有些同学说,哎,我想改一下这个竖,是吧,我想让他画的好看一点 啊,我可以把自己来改呀。啊,这个地方将这些数字都是可以改的,我想让数往左边倒一点,那我这里就改成左转四十度呗,然后呢?回去回是六十度,那我还往右边偏了多少?偏了二十度吧,那我再转回来二十度, 你看我现在我的数是不是往左边倒了呀?啊,还可以多倒一点,那你竖插的话,这里长度每次减五,你可以改成减四减三,自己去看一下效果。 我们还可以怎么样呀?改笔的颜色是吧?每一次将笔的颜色增加时,那我们看就是一个五颜六色的数量 啊,那我还可以,比如说像刚开始一样加上我们的苹果。那怎么做呢?那我们同样的找到每一个竖插的顶点结点的位置,是不是在这个位置?哎,每个竖插的顶点,左边顶点, 然后下面这里是右边点点,在这个位置呢。我去发发送一个广播。然后呢?我发送完广播之后呢? 哎,好,在这里发送一个广播。好,发送完广播之后,我的苹果去接收广播,是吧? 对,跑到这个位置,然后苹果呢?哎,接受广播,我就怎么样移到画笔的位置,画笔的位置,然后再涂张一个或者是克隆一个自己。 哎,这样我就可以做出一个苹果树了。好,当然我们也可以去什么,比如说你想做一个照片墙是吧?把苹果弄成照片都是可以的。好, 那我们还可以怎么做呢?啊?可以像这这个样子,我们可以画一个雪花啊,同学们可以看到我这个雪花实际上是怎么做的呢?你看我点击停止啊,在这个位置呢,我画雪 花一百。好,你先开始,大家看,我是不是就是画了一半很像刚才的树吧,和刚才的树是不是很像?然后呢,这是一个雪花,那我让他, 哎,重复执行六十,每画完一个雪花呢,比右转六十度,这就是为什么我说呀,画完之后最好能让笔回到这一个起点位置啊,你看我回到起点位置后,我画第二个雪花的时候,我是不是好掌握这个方向啊?我让他右转六十度画第二个雪花,重复六次, 哎,你看是不是一个雪花就出来了呀?那我们可以画出很多好看的图形,同学们可以自己去试一试。


好,今天给大家分享这个内容,是这个线索二查处的一个内容啊,那么还是希望大家能多多关注、点赞、评论,完成视频的一个播放,下面开始正式内容。那么首先这个线索二查处的话,它其实是 啊我们这个不管是考研四零八,还是在这个一些这个自主命题里面,他其实都会考到的一个知识点,所以这个话大家需要稍微注意一点,就是啊这个线头画差数, 那么我们在讲这个线索拉出的一个具体内容之前,我们先来讲一下为什么我们需要有这样一个线索拉出这个结构,对吧? 就是我们因为我们前面其实已经讲这个二叉数,比如说二叉数的话,其实我大家知道我们用二叉链表或者说用三叉链表,其实可以非常直观的就能把这个数给表示出来了,那么为什么还要用这个线索叉数呢?这里面其实有一个原因啊,就首先大家要想想,就是比如说这里面现在给大家一个例子,就是这个数,对吧?这个数非常简单,比如我们其实可以非常快的 根据前面所讲内容呢,我们写出这样一个他的一个前续变力、中续变力和后续变力一个序列,对吧?那么其实我大家首先这里面要给大家讲一个这个啊,题外话是不也不属于题外话,大家讲一个这个 便利二叉数的一个本质,因为我们在上个视频,其实我我们没有说到这个东西,尤其是便利二叉数的本质的话,就像是大家可以想想,因为因为我们在这个二叉数里面这种数结构的话,他其实表示的这个在逻辑上面他其实表示的是一个,是一个什么呀?是一个非线性的吗?就是他表示的是一个一对多的这样一个关系,对吧?其实是一个非线性的一个结构。 那么其实我们你大家可以看下这个前续便利或者中续便利或者后续便利,每一个每一个这个便利序列的话,他其实类似于什么呀?类似于我们前面讲的一个线性表吗?他其实逻辑上是一个一对一的,比如说每一个元素,对吧?每一个元素他都有一个前驱或者后继,当然在这个最开 始和最结尾这样一个元素的话,他其实可能是没有前驱或者没有后继的嘛,他其实完全满足了我们这个线性表的一个定义,就是一对一的一,一对一的一个关系。那么相较于我们在数里面,比如说这个 c 这个几点,他其实一个一对二嘛,或者或者一对多这样一个关系的话, 他其实是更加直观的,对吧?对于我们这个啊来理解的话是更加直观一点的。所以说我们这个便利二叉数的他的实质就像是我们要把这个数的一个飞线的结构转换成一个线性的一个结构,这个是他的一个实质,这个大家稍微记一下,就稍微熟悉下这样一个东西,因为像这些细节可能在很多参考书上可能并没有,对吧?可能并没有。 然后另外就像是那么我们知道就说我们当我们看到这个前序、中序、后续的时候,其实大家有一个非常直观的感受是什么?是我们可以比如说我告诉你,我说这个 d 这个元素,你可以非常快 把他的这个在前序便利里面的,他的这个就是前驱和后继给我说出来,对吧?比如说我说 d, 那么你直接说 b 和 c, 他是 b 是他的前驱, c 是他的后继,那么但是呢你现在要看这棵树,对吧?单独要看这棵树的话,我如果问你, 那么 d 的在这个前序变列的时候呢?它的一个前驱后继是什么呢?其实你可能你可能一一定要把这样一个前序的给它变出来之后,然后你才能说这个 b 这个前驱, c 这个后继,比如说这个其实这个过程是可能稍微麻烦的,对吧?上面因为因为你至少要变力一变这样一个数吗? 编出来之后你才能得到的一个前驱和后继,所以这样话是比较麻烦的。那么就比如说我们我们用这个线索拉出的话,就是要解决这个问题,就是就是要解决什么呀?解决我们无法非常直观的得到这个节点,在任意一个序列中前驱后继的一个问题。 那么怎么来做这个事情呢?就说我们在做这个事情的过程就就这样,就是我们其实在得到这个线所查数的过程中,我们是 啊,就是通过这个保存便利过程中得到这些信息来得到这个线索,他说的,那么所以得到这个信息的话,他其实是得到的是每个节点,在每一个就是在不同序列中的一个前驱或者后记这样一个信息,这个大家稍微注意点, 所以这里面就像是啊,那么我们如何来做这个事情?我们如何来实现这个线索啊?说的话就前面的话,我们讲的是为什么我们要有 这样一个线索二叉数这样一个结构,对吧?我们花了大概有四分钟的时间,那么后面我们就要讲这个线索二叉数是怎么实现的?那么这个线索二叉数的话,我们具体有了这样一个定义之后,我们该怎么去实现这个东西? 因为我们前面也说这个线索来说它本质上是要很方便的得到,得到某个祭的一个前驱或者后继吗?对吧?这个非常直观的一个想法。那么这时候我们到底怎么来做这个事情? 其实我们有两种非常直观的考虑,对吧?我们其实借鉴于前面我们讲这个二叉数这个几点类型的话,大家知道我们一般是用列表的形式,对吧?他的几点类型是什么样的?我可以把给他给大家画一下,对吧?大概是就说我们就是这个样子,对吧? 就我现在先就是大概是有三个东西吧,是三个,就说主要这个中间这个是个 dat, 然后两边两个是一个左指针,一个右指针,对吧?一个左指,一个右,一个右指针这样一种形式, 那么那么既然我们要保存的一个前驱和后继,那么其实非常直观一个想法,就是想法一吗?想法一这个想法就说我们在这个基础上呢,我们把原来这个三个,对吧?三个这样一个玉,我们把它扩展成,扩展成五个吗? 对吧?扩成五个,因为有了,有了这这这个是左指针,然后这个是右指针,然后这边这个是他的一个前驱,这个是他的后继,对吧?其实我们其实可以把它,把它扩展成 只包含一个数据,然后周边总共有四个指针域吗?这这种节点其实我们可以去用来表示这个线索的这个二大数的一个, 就说每一个机电他其出来有左右子数,然后还有一个左就是前驱或者后机指针吗?其实我们是可以表示的,但是呢这种导致的一个系这种机电这种机电类型的话啊,虽然说比较直观,但是呢他的这个存储密度是比较低的。 所以说我们就会有第二种想法,就是我们会用前面我们讲在这个二叉列表里面,他的一个以这个二叉列表来进行存储的时候,这个数的时候,我们 n 个节点的时候,我们往往会有 n 加一个空域,所以这个时候我们就考虑用这个 n 加一个空列 来表示这个前驱或者后继,那么将是这又让这个节点的这个空间给他充分利用了。所以说后续的话我们就提出了这个线索二叉数的一个节点是下面这种形式, 下面这种形式大家对比一下,为什么刚才说他的这个第一种形式的时候,他的存储密度比较低呢?其实大家可以看到就是我们在这个这个线索上,这个节点里面他其实 有两个这个,呃,这个 l tug 和 r tug, 它其实是两个,这种类似于是个标志或者标志位,对吧?比如当这个 l tug 等于零的时候呢,它表示的是我们这个 ltr 的这个指针指向是个左孩子,那么如果说 ltar 等于一的时候呢?我们将是我们这个 ltr 的指针指向一个前驱,因为它其实通过这个 ltar 的这个变量的变化的话,来来去就是说指示这个 ltr 的指示的一个就是到底指 指的是哪个位置,比如像是把这个 l q 的指针一单独一个指针有了多种含义嘛?然后我们通过这个 l l 探格来进行组合,对吧?组合有了多种含义, 所以说这个大家看一下,就说我们在这样一个存储空间里面,在这样一个存储单元里面,和上面这个存储单元有明显的一个区别,区别在于我们在上面这个存储单元里面,其实我们存了四个指针,那么在这个存在里面我们只存储了两个指针,那么大家知道我们其实真正在存的过程中,其实指针 他他的,因为指针他一般是和我们这个机器的字长,或者说我们这个存储的一个字长,存储这个单存储存储空间一个字长 是息息相关的。但是我们这这个像这种 l tag 了,或者 data 或者这些东西有相对数据于这些东西的话,它其主要是和数据类型相关的。那么一般呢?我们的数据类型是远远要小于 我们这个存储的一个字长了吗?这个大家应该知道,对吧?一般是要小于存储字长的,所以这个时候的话,明显我们要用下面这个结构的话,对吧?他的占用了存储单存储空间,水源要小,对吧?水源要小一点,但是呢他的这个数据所占的空间要占整个存储空间的这个比例 更大一点,对吧?这个这个大家应该可以还是可以考虑到的,注意刚才说这种,就说我们在整个这个节点里面,我们这个数据所占的一个,这个存储的一个啊,空间 存储的或者存储的一个比例吧,占整个这个存储单元的比例会更高一点,相对于上面这个,对吧?因为上面这个是包含四个指针,一个数据,但是这个的话就包含了一个数据,然后 两个标签,然后两个指针明显的话,这种形式下它的存储密度会更高一点,对吧?所以说这个就像为什么我们跟他说这个纯密度会小,是因为 我们下面这个粗重密度会更高,所以说的话我们就选择第二种情况,就是我们会加两个,在原来这个标签的基础上,我们加了两个这种标志位来指示这个 l q 的和 r q 的的一个,就是这样一个啊,就是他指向 这个真正的是一个左孩子、右孩子,或者说这个前驱或者后继,对吧?原来表示这个东西,所以说这个是他的一个节点,这个节点的话其实非常好理解,我就不不说,因为前面的话就给大家讲一下,为什么我们需要用下面这种形式,而不是上面这种形式,对吧?这种形式一般我们不会用的,因为他比较占用存储单元存储空间。 好,那下面就将是啊,我们这个啊定一些一些基本的定义,就是首先这个,这个是一个,我们来说下这个是一个线索,那么什么是线索?线索就指的是 我们指向节点一个前驱和后继的指针就指的是线索,比如前面刚才就是这个东西,就是这个定义,就是这样来定义的,所以说后面这个线索节线索链表就指的就是指的是上面以这个,对吧?这样一个链表,一个节点类型来作为这个二杀处的一个存储结构, 那么这个就是一个线索链表。那么线索二叉数就指的是我们在原来二叉数的基础上加上这个线索,那么刚才说这个线索就指的是我们每一个节点的一个前驱或者后继的指针吗?加上这个线索之后,我们就构成线索二叉数,这都他一个基本定义啊,然后这个线索化,对吧?一般来讲,我们在这个考题里面, 题目里面都会说,请将下面的这个数进行线索化,对吧?一般是线索化。线索化指什么?这就指的是我们要对这个二叉数按照某一种次序,注意这里面某一种次序便利的话, 一般来讲都是前序、中序和后续,那么除非有有些题目他自定义一个便利一种形式,对吧?让你去便利。一般讲如果不不不,不出意外的话,都是前序、中序或者后续便利这三种情况来使其变成这个线索化之后的一个过程,就成为一个线索化的过程。那么在这个线索化的过程中,我们一般讲,如果说 题目中让你画图的话,一般是我们用实线来表示指针,虚线来表示线索,那么具体大家来可以看一下这个右面这个例子吧。这个例子,那么在这个例子里面,其实我是啊画还是根据刚才这个刚开始这样一个简单一棵树,然后我把它画了一个中序的一个线索,大家可以看一下, 就首先其实得到这个数之后,我们首先是先把用这个数的话,我们是先第一步的话,第一步的话其实我们是要把它的一个中序边的一个序列给得到的,那么中序边的序列我在这已经写了,对吧?其实我把这个又可以把它粘过来,可以把 把它粘过来,对吧?把它把它放,把它放在这,我就不写了,其实我把它复制在这,复在这这个位置上,对吧?复在这个位置上,它其实它的中序边立序列,对吧?大家可以看到其实就是一个呃呃, d b, 对吧? d b, a, d b, a, e, a, e c f 嘛,对吧?这个序列,那么有了这个序列之后,那么根据这个序列,然后我们要把下面它的一个线索画线索,画叉数给它画出来,那么怎么画呢?首先我们还是把这个数的整体结构线给画出来,画出来之后的话,无非是呢,因为大家注意我们在增加线索的时候,我们其实是在它的一个 空链遇上进行增加线索的吗?增加线,所以说最终的话,我们会把每个几点这个为空的这些位置的指针,对吧?给他变成虚线,对吧?比如说你看这个 d, 因为他是在第一第一个位置吗?所以说 d 是没有前驱的,所以说他的前驱或者他的他的这 这个左指针,左指针到时候变成前驱了吗?所以前驱这个虚用虚线表示指向一个 no, 对吧?因为它表示没有前驱了,那么 d 的后继的明显 d 的后继是 b, 所以说 d 的后继就指向 b, 那么 b 的后继明显是 a, 那么 b 的后继 b l b 的右,因为 b 的左, b 的这个左子数是 d 这个元素,它是实线吗?实线就表示它是有有有有这个左子数的,那么它的右右边是为空的,所以说我们会把这个空炼玉用起来,用把用它的空右边的空炼玉指向它的后面后面一个几点 a, 那同样 a 它的,因为它是有左右指数的,所以说 a 是没有任何的一个前驱或者后继的一个 指向的,但是呢我们看这个 e, 对吧?这个 e 的话,明显它是在 e 的叶子基点上面,它的这个左右指数都为空,那么这个时候我们都用用它的一个这个空链运呢来表示前驱或者后继,所以 e 的这个前驱呢明显是 a, e 的后继呢是指向 c, 对吧?他其实就完全接住我们前面这个中序边这个序列来把这个中序啊线拿出给他画出来。那么下面这个这个话就像是我们是用这个刚才这个几点类型,我们构了构成了一个线索,一个二插列表,一种形式。那么像这种像这样一个形式的话,我们在 考试就是考研里面啊,一般来讲考察的不是很多,但是的话就是他可能会在一些自主命题,尤其是一些院校自主命题的时候,可能会说请你用这个线索链表来画出这个这样一个线索查数,或者说或者说这样一个结构,对吧?那么这个时候你就需要知道,就是我们在这个线索查数里面 他的这个两个踏格,对吧?两个这个标志位零的时候指什么一的时候,什么一般是零的时候呢?指的是他表示个左孩子,那么一的时候表示他的前驱或者后继这个东西,所以这个时候 话就是我们,呃,比如,当然我这里面画了一个头结,你也可以不用画,不用画这个头结也无所谓的。然后像是我们第一个几点是 a 嘛?对吧? a, 那么因为 a 这个几点话,明显他的左右指数都有嘛?你看明显左右指数都有,所以说这里面他的表量标签都是零嘛, 像是都有两个左右指,那么当有的时候我们就用实线,对吧?下面就就两个实线,就他的左右指都用实线来表示, 那么指向大家注意这个 d 这个位置,那么 d 这个位置呢?是因为 d 这个位置它是个叶子接点,它的左右指数都为空,所以这个时候我们就用让它这个 tact 值至为一,至为一之后,那么表示两边都是两个线索,然后分别指向它的一个前驱或者后际。那其实整体上这个用这个线索列表来表示的时候,其实和这个中序线索上说 这个结构其实类似的,只不过呢我们把每一个节点给展成了上面这种节点类型来进行画这个结构,对吧?那么今天这个视频呢,就给大家分享到,这 就是分享这个线索杀术的一个由来,以他的一些定义,还有他的一个画法,对吧?那么大家注意就是在考试过程中,我们考试更多的,对吧?可能就是他的一个画法比较多一点,但是他的一个基本定义 你也一定要搞清楚,为什么我们要有这个线的话,就是 e g 这个线索拉数,他的这个形式什么样子,对吧?这个大家稍微注意点。好,今天这个视频就到这,谢谢大家。

快来看,这将是一棵树,没有任何美术基础也可以画出这么漂亮的树。只要你数学学的好,又会少儿编程,那么就可以设计属于你的艺术作品,打开少儿编程软件试试吧! 首先自定义一个积木,画线长,画笔大小,将画笔粗细设为大小,落笔移动长度 还比结束脚本自定义二叉数。积木如果长大于二,左转四十五度,画线为长乘以零点四。画笔为长乘以零点零三。二叉数为长乘以零点七。 移动长城以零减去长乘以零点四步。然后右转九十度,设置划线为长乘以零点六,画笔为长乘以零点零三,二叉数为长乘以零点五。移动长乘以零减去长乘以零点六步。左转四十五步。当滤镜 起被点击排比,将画笔颜色设为绿色,面向零度方向移动到中间位置。将画笔大小设为十,落笔移动六十步。搞定,运行看效果!

好,我们对本节课的内容进行一个总结。本节课我们主要学习了二叉数的便利和线索化,其中二叉数的便利中地规便利和非地规便利两种。地规便利的时候,我们如何对于地规这样的一个 具体的操作进行理解,而非地规便利的时候,我们又需要用到的是占这样的之前学到的一个数据结构。第二就是二叉数的线索化。线索化的时候新增添了两个节点,也就是对于左右 孩子进行判断之后得到的左右标志位,而这两个标志位分别我们可以存储的是前驱和后继。当然了,二叉数的线索化的时候也是一切以左右孩子为主, 如果说这个节点有左右孩子,我们就没办法去存储他相应的前屈和后继,只有当没有左右孩子的时候才可以进行存储。 另外二叉数的线索化如果出现悬空的状态,我们可以用一个新的节点将它进行一个承接。好,这就是本节课二叉数便利和线索化的相关内容。 这节课的内容非常多,大家在下来之后也需要对于低规以及非低规编例,还有就是线索化的一个具体画法进行一个总结。


各位同学大家好,我是教化学编程方老师啊,我们又继续学习啊。嗯,如果觉得老师讲的不错,记得点赞和转发支持哦。 那我们前面讲了,嗯,奥,茶树的那个便利里面的前序,中序、后续以及对应的一些第一道习题吗?就是根据土兰话的树,然后通过树来 验算这个铁序组区后续啊,那么我们这题呢,也是实体里不常见的,就是通过嗯表达式转换成数,或者把数转换成表达式 啊,最后可能还就是最后呢聂布兰氏啊,聂布兰氏呢,是一种计算机里面一种,嗯,快速的方法就是算法,他可以方便的避开来, 那个就减少了家里城市的处理啊。那我们来看一下例子,例子是一个三加二,括号乘以六啊,就这样,那他其实是一个大的一个,嗯, 一个二差数,那么从这里可以看出来,例子可以看出来三加二,那就是这么一个读取顺序,然后最后是这么一个读取顺序,对吧?所以这里呢,其实就是中序啊,因为这个根结点在中间啊, 明白了吧,那这里其实也一样的,那我们来看一下,这里可以当做一棵树,这里可以当做一棵树,对吧?中后中间是有那个信号来处理的, 那么可以从中表到就是中句表上来看到最后一个数组,因为最可以看到一个数,最可以看数,这个数肯定是根最终的根结点啊,所以他你可以这么画啊,因为二这边是没有任何的其他了,然后这边呢,因为是 这个的跟乘号啊,然后左边是三,右边有加号,那么说明加号也是中中跟进点啊, 一个四一个五,是不是很清晰?你就把这个看作一个整体,这个在这里,这个又看这个整体,然后这里个整体是不是就很好了?那么对应的聂波蓝是什么?聂波蓝色一般用的是什么?是后续, 后续怎么弄?后续是先左对不对?先找到三,我们接下来三啊,三。哦。先左后右最后中吗?那右右边发现他有左左边,后面是空的,是叶子结点,那就不用管下面四,对吧?先左后右,右边是五, 最后中啊。最后跟跟是什么?加号啊?就这样表示,然后再往上。哦,又到成号了啊,好,左边都完了,后右右是二,最后是这样,明白吗?就是后续啊,布兰尼布拉斯用的就是后续, 那么至于店门是之类的应用什么之类的,我们后面专门弄个专题来讲,所以就不展开了。好,谢谢大家。嗯。

二叉数分型图是一种基于二叉数的分型图形,它的生成机制是从一个跟节点开始,每个节点都有两个子节点,这些子节点可以是空的,也可以是非空的。二叉数分型图有很多种, 其中比较著名的有加必达、哥拉斯术、巴恩斯利爵类等。这些分型图都是基于二叉数的生成机制。通过地规的绘制每个子分支, 最终得到一个美丽的分型数。我们就先画最基础最常见的一种分型数模型对称二叉数,后面逐步给出一系列与之相关的众多迷人的图形 生成机制。如下图,以长度为一的垂直线段作为树干顶部,分叉成两个分支,每一个分支与树干的延长线所加角度都为 菲特,每一个分支的长度都是二,这两个分支又构成了子数的主干,子数又按照同样的规则分成两个更小分支,夹角仍然为菲特,四个新分支的长度则都是 根据这个规则不断的添加更小的分支,便得到了对称二叉数。在绘制分型图时,我们从根节点开始地规的绘制它的两个子数分支, 这样我们就可以得到一个二差数分型图。划单一的二差数地规结数条件是层数按等于零, 此时就是画一个线段并退回。按零就是画一条线段,左转 fitter, 画一个稍短的线段,再右转二 fitter, 画刚才长度的线段,转回最初的方向并退回。下一 一轮,把上一集的分支当做下一集的主干重复下去。下图就是第一集和第二集的分型图,他的初始动作非常简单,就是画一根线段并退回。因此首先我们先定义一个画线段并退回的模块, 便于在地规的初始状态时调用。再来设计地规程序。最初就是调用此程序画一段树干,按零。每一集都是先画一段上一级长度的树干,然后按一定缩小比例左转非特化左分支退回。右转二,非特化右分支 退回。后面对每个分支地规划下去。为了画的更逼真,每一集的线段除了长度要缩短外,粗细也要逐级变细。我们把枝干长度、粗细、层数和转角这些可变量设 制成地规子积木的参数,便于下一集调用。主程序设置好一些初始值,比如地规的层级、树的长度、粗细、尺寸和初始位置和方向等等。当然也可以用地规以外的方法画出分型。 以后会介绍有兴趣的读者动手试一试可否增加颜色的变化,让末梢更翠绿。尝试改变转角菲塔的值和长度粗细的缩放笔,看哪个值数更好看。怎样处理两个分支的转角和回到原来方向,画一颗偏向一边的树。

我们知道,对于二分差数分型,随着迭代级数、倾斜角、伸缩笔等值变化,分型数也跟着出现千姿百态的形状。我们可以做一个由循环构成的动画程序,演示随级数递进 角度变化的不同分型图。伸缩比 s 去零点六一八。你也可以建立一个随伸缩比值变化的动画程序。反复观察会发现,如果比例因此伸缩系数太小, 树的分枝就会稀稀落落,整棵树形如枯木朽株如果太大,分枝就会彼此重叠,绿盖如茵,遮天蔽日。 如果左右两边分支刚好接触且不重叠,这棵树就一定非常特殊。研究表明,对于每个角,菲特都有一个唯一的比例因子 rsc, 我的对称二叉数刚好能够左右接触且不重叠。而如果比例因子 rsc 又刚好等于黄金比例零点六一八,那么这棵树就又拥有了极其独特的美学特征。我将之称为黄金对称二叉数。计算可知,黄金对称二叉数一共有四种, 分别对应于菲塔为六十度、一百零八度、一百二十度和一百四十四度。你自己可以先选定一个角度,不断变化伸缩比 s 的值,看看哪个 s 对应的树枝互相不遮蔽,是做一个画对称三叉数分型的程序。

学编程到玉龙同学们,我们在学习高阶算法的时候,往往无法第一时间理解其抽象的含义,今天就让我们另辟蹊径,学习使用拍手的特头库来绘制二叉数, 以便更直观的了解二差数的便秘。在开始之前,我们先来了解一下什么是二差数。 二叉数是一种特殊的数字数据结构,每个节点最多有两个字,节点通常称为左指节点和右指节点像右图就是一颗常见的二叉数。 现在让我们来看看如何使用 toto 来绘制一棵二叉数。首先我们需要创建一个 toto 对象,我们可以使用 toto 对象的左转和前进等方法来控制它的移动方向和距离。接下来我们来讲解一下代码的主要函数步 参数,一是绘制数字的长度参数,二是每次旋转的角度。根据刚才的绘图思路,我们会优先画出左侧数字。 画完左侧的数字之后,我们会进行一个回数,回数过后会开始画右侧的数字,画完右侧数字之后再次进行一个回数。 重复这个地规的过程,我们就可以使用 turtle 绘制完成一个完整的二叉数。当然实际的操作需要更多的细节和技巧,这需要大家在实践中不断的尝试和掌握。 程序已经演示完成了,最后汪老师来考考大家,二叉数一共有几种便利方式呢?今天的程序又是其中的哪一种呢?欢迎知道同学在视频下方留言。

同学们好,今天我们来讲数据结构与算法课程第六章数和二岔数中第四节线索二岔数的相关内容。 通过前面二岔数及其便利算法的学习,同学们可能已经体会到了,二岔数的便利是比较复杂的,需要用到地规或占。 同时也知道二岔树虽然是非线性结构,可便利得到的却是节点的线性序列,但在二岔树的存储结构中,没有结 在便利系列中间的前驱和后继。与此同时,在二岔数的二叉链表存储结构中,对应于 n 个节点的二 n 个指针,却有 n 加一个指针,都是空指针。 因此,我们设想利用这些空指针指向节点在便利系列中的前驱或后继,从而实现不需要地规或占就能够方便的便利二岔数。这一想法能够实现吗? 回答是肯定的,这就需要学习今天要讲的线索二岔数的相关内容。对于线索二岔数,我们要学习线索二岔数的相关概念, 线索二岔竖、线索画的方法和算法。便利线索二叉竖的方法和算法。好,接下来 首先介绍线索二岔竖的基本概念。前面讲到,在二岔竖中,我们希望把空指针修改为指向前区和后继的指针,但在这里 就把指向前区和后继的指针称作为线索,而把空指针修改为指向前区和后继的这个过程,就称作为是线索画。二岔数经过线索画之后, 也就是空指针指向了前驱和后继之后,就称作为是线索二叉数。存储二叉数的二叉链表含有了线索,就称作为是线索链表。 在此,有同学可能就会有疑问,在线索二岔数中,如何正确的区分指向孩子的指针和指向前区后系的线索? 为解决这一问题,我们对二叉链表节点结构进行了扩充。原来,二叉链表中的左孩子、右孩子和数据域依然保留增色。左标志欲和右标志欲,这是两个波尔型的数据欲。 标志欲的功能就是区分指针和线索。左标志欲为零,表示左孩子欲依然指向的是真正的左孩子。左标志欲为一,表示左孩子欲指向的是节点的便利前驱。 右标志欲为零,表示右孩子欲指向的是真正的右孩子。右标志于为一,表示右孩子欲指向的是节点的便利后继。到此,同学们可能还会有疑问,线索二岔数中节点的线索所指的前驱 和后继到底是哪一种便利策略下的前驱和后继呢?事实上,依据便利策略的不同,存在三种不同的线索二岔数。依据二岔数、 先序、中序、后续便利的策略,对应的就有先序线索二岔数、中序线索二岔数和后续线索二岔数。下面我们以这颗二岔数为例,来分别介绍先序、中序、后续线索二岔数。 这棵二岔树的鲜絮便利序列是, a、 b、 d、 g、 c、 e、 h、 f。 让所有的空指针按这个序列分别指向前区和后继,就可以得到一颗鲜絮线索二岔树。具体来看, b 的幼孩子 指针为空,所以应改为指向他的后继。 d、 d 的左孩子指针为空,应改为指向前区。 b 记得左孩子指针为空,应改为指向前区。 d 记得右孩子指针为空,应改为指向后继 c。 以此类推,把所有的空置针都改为指向前驱和后继,得到的就是这样一颗。先叙线索二岔树, 再来看中序的情况。中序便利序列是, d, g, b, a, e, h, c, f。 让所有的空置针都按这个序列分别指向前区和后继,就可得到一颗中序线索二岔数。具体来看,地的左孩子为空,所以应改为指向前 区,而第一节点的前区为空。线索化之后就是这样的,记得左孩子指针为空,应改为指向前区。 dg 的右孩子指针为空,应改为指向后继 b, 以此类推,把所有的空指针都改为指向前驱或后继,得到的就是这样一颗中细线索二叉数。再来看后续的情况, 后续便利序列是, g, d, b, h, e, f, c, a。 让所有的空指针按这个序列分别指向前区或后继,就可以得到一颗后续线索二岔数。具体来看, 记得左孩子指针为空,应该改为指向前驱,而第一节点的前驱为空。线索化之后就是这样,记得 右孩子指针为空,应改为指向后继。地地的左孩子指针为空,应改为指向前区继,以此类推,把所有的控制针都改为指向前区和后继,得到的就是这样一颗后续线索二岔数。 好,有关线索二岔数的基本概念就介绍到这里,下面我们重点要学习的是如何实现二岔数的线索化。 如前所述,把空指针修改为指向前区和后继的线索的这个过程就称作为线索画。那么这个过程如何实现呢?下面我们就来做具体的分析。 首先要把每一个节点中的空指针都修改为线索,就要便利到每一个节点。因此, 线索画应该是以便利为基础的。在便利的过程中间,当访问到某一个节点的时候,确认其某个孩子指针为空,如何让他指向前驱和后继呢?这时必须能够找到前驱和后继。 因此,在便利的过程中间,仿照以往算法设计中的经验,我们设一个指针指向当前的访问节点,再设另一个指针指向他的前驱节点。也就是说,在便利的过程中,始终要保持一对前后节点指针。 在此使用 p 指针和 pro 指针, p 始终指向当前访问的节点, pro 始终指向 p 节点的前驱节点。在整个线索化的过程中, pro 和 p 始终是动态 变化的一对前驱和后继节点指针。有了这样的设定,空指针修改为线索就很容易实现了。对于当前节点 p, 首先犯定屁的左孩子是否为空,若为空,则修改为指向屁的前驱 pro, pro 是 p 的前驱,相对于 p 来讲, p 就是 pro 的后继,这一点十分重要。接下来,判定 pro 的幼孩子指针是否为空,若为空,修改为指向后继 p 就可以了。由此,我们可以完成当前节点左指针的修改 及其前区节点右指针的修改。随着便利过程的推进,每一个节点的空指针均可以得到修改,线索化的过程就如期 实现了。当然,指针修改为线索的同时,相应的标志欲也要由零改为一。 下面来看一个中序线索化的势力。首先,初始化普奥为空,因为第一个节点的前驱应该是空。 访问的第一个节点 d, 他的左孩子欲为空,应修改为指向 pro。 随着便利过程的推进, pro 和 p 指针要按照 d, g, b, a, e, h, c, f 这个便利系列继续前行。 pro 指向 d, p 指向 g, 由此判定 p 的左孩子为空, 修改为指向前驱,而 pro 的幼孩子不为控,故不做修改, pro 和屁继续前行。此时 p 的左指针不为空,不修改 pro 的右指针为空,改为指向后继。 pro 和 p 继续前行。 p 的左孩子不为空,不修改 pro 的右孩子为空修改。 如此类推,直至便利到最后 p 为空, pro 指向最后节点,其右孩子为空,进行相右修改。至此,线索化的过程就完成了。 关于线索化的方法就讲到这里,下面要讨论线索化的算法。通过刚才的讨论可知,以二岔数便利算法为基础, 添加线索化的相关语句就可以得到线索化的算法。我们仍然以中序线索化为例进行讨论,这是我们非常熟悉 的二岔数中序便利地规算法。线索画只要把空指针修改为线索,因此地规访问左右子数的两个语句保留不变,只需修改访问屁节点的语句,把线索画相关的内容添加进去即可。 依据上述讨论的线索画方法,对当前访问的屁节点判定其左孩子是否为空,为空,则屁的左孩子指针修改为指向前区 pro 切标志欲之为一, 再判定 pro 如果不为空,并且 pro 的幼孩子为空,则 pro 的幼孩子指针应改为指向后继 p, 并将右标志域修改为一,然后需要将 p 指针付给 pro, 以便当 p 指向下一个要访问的节点时, pro 指向的是刚刚访问的这个节点,也就是 p 的前驱节点。至此,中细线所划的算法已经修改完成, 以此类似先续线索化以及后续线索化的算法,在先续便利算法和后续便利算法的基础上进行相应的修改就可以得到。 好。关于线索化的方法及其算法,我们就讲到这里。今天我们已经给大家介绍了线索二岔数的基本概念及其二岔数线索化的方法和算法。 下次课我们将要给大家介绍线索二岔数便利的方法及其算法,希望同学们课后能够结合前面学习的 二岔数便利算法,把今天所讲的二岔数线索化方法和算法掌握好,并设计完成先续线索化及其后续线索化的算法。好,今天我们的课程就讲到这里,谢谢大家。

罗同学在做二叉数便利的题目的时候呢,会觉得很头痛啊,你要一个一个的去推,而且容易出错,那么今天朱老师给大家分享一个用图画图来解二叉数便利的这样的一种方法啊,保证你三分钟就学会,而且呢一定不会出错。 首先呢,我们以这样的一个二叉数为例啊,我们我们用黑线给他画一个二叉数的轮廓,把每一个节点都包裹起来啊,我们看到用这样的一种形式,每一个节点给他包裹起来, 好回到根结点。那么怎么样求它的便利呢?哎,我们把这个图往边上移一点,先用一个橙色啊,我们先呢来看它的前序便利是什么。首先我们 在每一个节点的左侧啊,去画一个小圆圈,哎,这个圆圈呢,要跟刚才的这一条轮廓线去相交,我们沿着这个轮廓线,你去数一数它的 跟这些圆圈的相交的顺序啊,那么就是得到了它的前序便利, a, b, c, d, e, f 啊,非常轻松,你都不用动脑子,直接数着这个圆圈过来,就得到他的前续便利啊,我们看一下中序便利,我换一个颜色。中序便利呢 啊,我们在他的每一个节点的下方啊,去画一个圆圈,我们看这个轮廓线啊,他是以什么样的一个顺序去串联这个下方的圆圈? 第一个串的是 c 啊,串的是 c, 所以我们呢先写一下中 c, b, 然后 d, a, f, g, e 啊,这个就是它的中序便利,那后续便利呢,一样的道理,只不过我们这个圆圈啊,画在每一个节点的右侧 啊,那画在节点的右侧,同样的,我们去数一下这条轮廓线穿过这一些节点的顺序,第一个 是 c, 第二个是 d, 然后 b 啊,然后过来,注意啊,这边是先是 g, 然后 f, e, 最后是 a, 对不对?非常的神奇 啊,我们用这样的画图的方式,你根本不需要动脑筋,直接按照这个顺序去数一遍,结果就出来了。那么如果告诉你前中后 其中的两种啊,中或者前或者中和后啊,那么怎么样求第三种边例或者复原这个啊查数呢?那我们后面的视频来告诉大家,那在朱老师的系统课中呢,包含了很多这样的 简单实用的解题技巧,能够帮助你去轻松提分啊,请大家多多关注。