00:00
好,那么这个写完了以后呢,我们来做一个测试,就现在呢,我们写了它的。子节点又起了,插到它的负节点,就差一个方法了,就什么呢,删除这个方法。那删除方法这个逻辑是怎么样的呢?我们来简单的看一下它这个删除的。这个逻辑也是非常简单,首先我在这判断你这个root是不是等于空。对,是不是等于空,如果它不等于空。啊,如果它不等于空。那么我们就去查找这个节点。当然,查到节点也有可能是等于空了,如果等于空,我们就不去查了,因为没有这个节点。然后呢,这个做完以后,我们就去查找它的负节点。负节点,查到这个负节点过后,我们要去判断。判断什么呢?就是你的这个target node到底是不是个yes节点?如果是叶子节点的话,我们又去判断你这个叶子节点是我这个负节点的左边,还是我负节点的右边。
01:06
然后再把它。挂上。看见没有,看我这是样子的,判断是不是叶子叶点。这个条件就可以判断,就是它两边都会空,说明它是叶子叶点。如果是的话呢,我们再去判断它左边如果不等于空,而且它左边这个节点就等于它就把它就把它左边删除就行了,右边也是一个道理。好,我们把这个代码给大家写一下啊,我把这个代码写一下。写一下这个删除,删除我们写在哪里呢?写在这个banner sal trade这个方法里面去就可以了。找到这,这个是no no search,还有node里面的search parent就写完了,我们找到它的这个数。好,这个数,这个数呢,我们开始写方法啊,来走。
02:01
在这里我们也要写上。哦,我们要写上,呃,在这一层也要写一个search,就是调它啊,就是Di search。哦,我们把这个写完,Search,你到时间给我一个什么呢?给我一个value。OK,给我一个value。你给我一个value过后呢,Search,我会返回一个节点。Load。No。那在调的时候呢,首先我判断如果root。它不等于空。我们才去进行这个root的一个遍历查找设置,把这个节点返回,但这问题可以写个return。OTUR。如果说你这个地方就已经是这个,那就返回一个,喏,就是你这个是个空数。同样。这个是这个就是查找,就是相当于说我在这个batter里面调用了那个load节点,那个查找节点的方法。
03:07
啊,就是查找节点。好,我们还有一个方法。也要写到这一层。对,查找负节点。的方法,这个写完后面就比较简单了啊方法。查找附近方法怎么查呢?就是我们的这个search。Parent。Parent,好,同样你把这个值给我。你把这个纸给我。你把这个纸给我过后,我同样返回一个no。此时此刻代码呢?跟刚才几乎是一样的,如果它不等于空。对,如果它不等于空,我们就去调用。调用。他的方法。这什么root的点。把value放进去,否则直接返回一个no。
04:03
各位。否则直接返回到那写完过呢,现在的删除方法就可以写了,因为有这两个填写条件,删除方法就比较好写了,删除。删除这个叶子,删除节点。现在只考虑的是第一种情况。我们现在只考虑的是第一种情况啊,同学们还没有考虑别的情况,因为。现现在考虑的是。呃,第一种情况,现在首先考虑的是第一个。先考虑的是,先考虑的是叶子。叶子节点。OK,那第我们就写个。Dl no。同样你在进这个删除的时候呢,你把这个value给我。最终你是从这给我传进来一个value。VE好,来一个int删除了这边我就,呃,反正删除就删除,没有删除我也不管它啊,那现在。我们就来。
05:01
进行这个删除,首先第一步先。啊,但是我在可以做一个判断啊,其实这个判断可以不要,也可以写上,有些人呢,喜欢写上,如果说如果这个呃,Root等于空,我们就不查了,其实这句话呢,可以不写。因为你在里面也做了判断了,但是你如果为了效率高一点,就是说不要到里面查的时候才返回这写一个也可以啊,如果是空诉我们就不删了。如果是空诉就不删除了。好,下面呢,他不是从不是空树,我们就有这样子先看。有没有这个节点,有没有要删除的节点?因为你这个节点都没有,你你肯定没就不要去找他负节点了嘛。所以说我现在呢,第一个节点叫VR target啊,就叫VR它。它get no就是我的目标节点,目标节点呢就用search。把这个value放进去,现在我有一种可能性,就是这个目标节点是个什么呀,是个空的。
06:07
如果是空,我们还有没有必要往下走?没有必要,就说你这个你你都没有这个节点,我玩什么呢?就直接直接返回就行了,这个连return都不需要啊,就直接不走了,说如果没有这个要删除键,没有要删除的这个节点就退出。就直接返回。直接返回。对不对,那如果说有,是不是可以继续往下走,如果有的话,是不是就我就可以尝试着找它的负节点了。对,我就可以找他的副经理,于是呢,我就写查找。查找这个target。Target load的load的负节点。也很简单。写一个。呃,几个啊,2PARENT parent node。Node nod这个parent node呢,我们用search。
07:04
Parent。把这个,呃,把这个value放进去。啊,放进去好,这个就找到了,那这个parent node呢,我们因为有些同学可能说parent no如果为空怎么办。没关系的,就是因为我在这里面也也有可能在parent为空,也是有可能的,我已经在这做了处理,哪哪地方做了处理的在这。大家有没有发现我这句话在这儿其实有做处理?你们如果刚才仔细看的话,其实看到这个条件了。对吧。因为如果有一种情况,它就是没有负节点,谁谁没有啊,这个哥们不就没有吗。对吧,你看这个七一上去过后。你你发现他找,他找的时候,他就找不到负节点。这个时候其实它就它就不满,因为它这这个左都等于这个等于空了,这个也等于空,是不是直接返回一个空了,因为你看这个衣服。
08:02
不等于空踩进去。这个它左边也是不等于空才左递归,右边不等于空才右递归,那对于这个根节点是不是这些条件它都都不满足,它就直接走这了,只能。是不是我也考虑到这个根节点的问题了?没问题。说说是没问题的啊,大家不用担心,那现在回到这边继续写。啊,这源代码稍微有点复杂,对不对,其实也不是很复杂,那现在呢,我们又接着往下看。那现在我们就来判断了。就是因为我们我们现在先考虑的是叶子节点,那同学们。什么样的节点才是一个叶子节点呢?告诉我什么样的节点才是一个液体点?是不是target.left。它等于空。并且各位,并且这个target.right也等于空,在这种情况下,它就是一个。
09:00
电视节点。对吧,如果它是一个叶子节点,我们怎么样把它处理一下就可以了,同学们。那你看啊,这个是个叶子节点,你你是不是特别简单这个事儿。直接把这个。你target是个叶子节点,就是它下面没有任何东西,我就要判断,下一步是要判断这个target load是我parent node的左节点还是右节点啊。有点晕圈是吧,你再想一想吧,假设我们三十四二。假如我们32这个二是不是下面没有节点,它是个叶子节点了。那么它的附近点是不是是不是一啊,可是你你怎么知道我们要把这个三数,是不是要把这个一的左这个右边的这个这个这个月字为空啊,但是你是不是要先判断这个二到底是它的左还是右啊。没问题吧,好。对对,说的很对,但是有有一个动作,所以说你下面要干点什么,要判断要删除的。
10:04
判断删除的这个节点是parent。楼的的左。左左子节点。还是?还是右子节点?能理解这意思吗?啊,但是有同学说这个我我怎么知道这个事呢?啊简单吗?你这样写,如果这个parent。啊,但是这面判断还有可能是空啊,你一定要小心。所以最好呢,还是判断,如果在它不等于空的情况下。啊。呃,当然这个target都不等于空的,呃,Target。这个地方叶子节点,叶子节点进来过,它就不可能为空了,是吧?哎,对了,那就不用担心了啊,因为你这个它是叶子节点,就是它是叶子节点。诶,那他的刚好就是一个节点,怎么办呢。对吧,还是得判断一下,最好是parent node不等于空。
11:03
不等于空。啊,并且。并且什么呀,点。ne.no啊,不是no,是value等于。你这个value。说明什么问题?说明你这个。说明啊,这个呃,不对啊,我看看啊,对对对,试一试,就是左边这个节点刚好等于它是不是说明你这个,你这个是他给的是我的。左节点是吧。好,左节点,左节点是不是我就做一件事情,Parent node.left是一个空就可以了。是这意思吧,那当然。这个L是一了,因为啊,就是我看看啊,如果不等于空,然后呢,这个左边等于,因为它是负极点,肯定要么是左边等于它,要么是右边等于它,对不对,它不可能说一个都不等于,说这样子else的话,是不是就把它的右节点。
12:06
只剩一个空。是不是这样一个条件。有问题吗?那那那什么问题啊。那这个是啊,我判断它不等于空了吗?它不等于空,如果它左边等于它。呃,也也可以,就是呃,我们这个,我看看这个应该是没问题吧,我们试一下吧,好吧,试一下有问题吗?大家觉得。好,试一下,试一下,如果有问题我们再调好。走一个,我们现在可以马上做一个测试。现在呢?我们删除一把。删除我们删除谁呀,我们就删除这个二好吧,Bary点。我们delete load2这个节点。
13:02
好的,那删除完了过后呢,我们再遍历一下。对,删除后。删除。删除后,删除后我们还是用中区便利。颠。In,那这个地方其实便不便利都无所谓了,对吧,但是呢?编辑一下也可以,我们执行一下,看这代码有没有问题啊叫。这边是滴滴的,这个也写了。调用了吧,删除节点不等于空,下面这些都写了好。我们现在只考虑到啊,我们现在只考虑是业绩一点。所以说你认识点这他他会进来的。我们执行一下。我们执行一下。好,我们发现有一个空子的异常在哪里呢?就在这儿。这地方为什么有一个空子针呢?哪个地方充值针了呢?
14:02
这个地方是吧。所以说这方应该怎么去处理一下呢?是不是应该这样写啊?是不是?Left不等于空,我们再去这样做。是不是好,我们再来走一下。再判断。走一个有问题吗?大家看二是不是已经被干掉了?被干掉了,那现在我们再来测几个其他的这个节点来,同学们,那因此我们都把都把它每个都测一下,现在呢,我们看还有哪个是叶子节点五九五九十二。是这意思吧,五九十二来走一个五。跑一下。找一个五,包括五这边干掉了没有,也也干掉了,对不对,五九来写个九。九。就我们也执行一下。
15:02
九我们也自己一下也没有问题,对不对,再来看一个还有个什么12。还有个12,我们再执行一下。我发现这个12呢也被干掉了,但这个时候如果你删除这个一这个节点,你们觉得他会怎么办?如果删除这个一界点。他会报异常还是说相当于说什么都不做?其实相当于什么都不做而已,你这个三路过这个一呢,你看他还在这。只是你没有处理吗?诶,一被干掉了吗。那时候也变得。诶一在哪,哦哦对对对,你这个一做完了之后,一是不是也变成yes节点了,都我的意思是这样子啊,我三个七。七是不是这个时候还不是叶子体节点吧?那这个时候我们再来玩一把,看这个棋,你看看他有他有什么处理吗。发现C是不是纹丝不动啊,纹丝不动,因为你现在人家还不是叶子节吗,所以你没有办法除以它。
16:00
好,同学们,关于这个删除,我们先截一段视频啊。大家可能还一时半会没有理解到位,后面再慢慢想就行了,我截一段视频。
我来说两句