00:00
各位同学,我们来看一下。刚才我们讲的这个删除节点的。一个注意事项,大家看我这里呢,有一系列的删除动作,我们来删一下,看看它能不能把整棵二叉排序树删掉。我们来看一下我们运行。大家有没有发现我按照这个顺序来,三二五九十二七三一十,是不是把这几八个点全部删掉了。没有,而且大家也看到没有报错,对不对,他告诉我们二叉排序数为空,不能变利,正确的。呃,但是实际上我们地方是有一个问题的。但是实际上我们这个代码有一个有一个问题,大家发现在哪里吗?大家看如果我把这句话。提到上面去。也就是说,把刚才删除十和删除一的这两句话颠倒一个顺序,我们再运行,同学们可以看到这里抛出了一个空子的异常。
01:06
那么这个空指针异常是。为什么会发生呢?来,同学们,我们分析一下。各位同学。假如我们把我们目前啊,各位同学,假如我们现在删除了二五九十二七三,各位同学,我运行这个时候代码呢,没有错,他说。现在还有一和十这个节点。那么我想问大家,此时此刻,此时此刻,我们这个根节点是一还是十?大家知道吗?好,我们可以试一下,现在呢,为了把刚才那个问题找出来,我我们现在现在再加一个方法,就是get它的root。Get它的root,来,同学们,我们打印出现在这个root节点是什么?Root。等于。加上root。
02:02
OK,呃,用用什么来写写呢?用batter battery tree,我们get root,我们运行把。各位同学,现在他说root节点目前是十。那也就是说此时此刻,我们这如果画一个二叉,二叉排序数的图来说十这个节点。是我们当前的根节点,那么一这个节点呢,显然是在它的左边,因为这样才能构成一棵二叉排序树。好,现在情况是十指向一。而且它的右子右节点呢是呃,右子节点是空的,大家看。按照这样一个情况,我们现在是不是应该走的是删除只有一颗指数的这么一个业务逻辑,那打开这个业务逻辑,我们看一下我们是怎么写的。同学们认真听啊,这地方这个地方是有一个漏洞的。那大家看我们是这样写的。
03:01
我们是这样写的,大家有没有发现,如果我们删除只有一颗指数的节点,我们是走的这个业务逻辑很好,他说如果要删除的节点是左子节点,这个条件满足,我们就往下面走了,没有问题。但是大家有没有发现?我问大家一个问题,现在这个parent。现在这个parent。它有吗?也就是说在在只剩下这么一棵树的时候,比如你删除的是十删除一。如果你现在先先删除一,这是没有问题的,这这就是为什么刚才没有报错。但是如果在这种情况下,如果你删除的是实,问题就严重了,因为你删除十的时候,这个十这个节点它的parent其实是为空,但是你却怎么样呢?你却把这个parenting.ne进行一个处理。这又有问题了,也就是说实际上你这个业务逻辑你少了一个判断,什么判断呢?就是你在走这段代码的时候,你应该判断parent是否等于空,如果parent不等于空,你才能走这个业务逻辑,那如果parent等于空呢?比如说。
04:12
现在现在这样一个情况下,就是parent是等于空的吧,如果是等于空,你应该怎么做呢?同学们想想。如果,如果是等于空,说明你现在删除的这是一个什么节点?这是一个根节点,而且这个根节点呢,还恰好它。它恰好这个根节点呢,呃,它下面有一只有一棵左子树了。明白意思吧。好,那那既然如此,你如果是拍在这种情况下。Parent等于空的情况下,其实你可以让root。直接指向哪里呢?指向这个节点,这事就结束了。是不是这样子的道理,因为你右边没有吗?因为你这样是只有一颗柱子,你右边是没有的,当然不可能在。
05:02
再起什么波澜,但是在这种情况下,其实你在这种情况下,你应该让parent呢。就是说如果parent应该是在parent在这种只有一个节点的时候,刚好parent又等于空的情况下,其实你应该让root指向这个,让root这个节点指向他,这个事就结束了。明白我的意思吧,也说代码应该怎么修改呢?各位同学应该这样写,如果parent。最近它不等于空,我们还按原先的业务逻辑走。是不是这个道理?姜总。Else,如果在这种情况下,你的parent就已经等于空了,其实你只需要让root指向哪里呢?其实你这个时候只只需要让root指向我们target。点它的left,这个事就结束了,下面的逻辑也是一样的,下面的逻辑呢,一样的道理,如果parent。
06:01
它不等于空,我们走这走这一段代码是不是?同学们,如果parent等于空怎么办呢?好,也需要让这个root指向target。点right这个就结束了,好,同学们,当我把这段代码进行一个修正以后呢,我们再来执行这段代码就不会有问题,大家看,首先我们看原先代码有没有问题,原代码没有问题,好,现在呢,我接着删除十。原先刚删除时,原先是要报报错的是吧,现在再看不报错了。只有一个节点了,那接着再把最后这个节点删掉。有没有问题?没有问题,是不是你原先没有这两句话的时候,你把十放在前面,放在上面是要报错的,是不是好,我们把这个顺序再颠倒一下,看看有没有问题。同学们看,仍然是没有问题的,是不是?同学们好,那这就是刚才我们对这一个代码的一个修正,也是我们需要注意的,注意的地方就是在删除。
07:09
有。一颗指数的时候呢,要考虑它的负节点是不是为空的情况。OK,这点请大家注意一下就没问题啊,这个顺序你随便颠倒都没问题了,我随便写啊,我随便颠倒这个顺序。我随便颠倒,现在我彻底颠倒,一直行为空对吧,我再随便颠倒,因为这个测呢,也不是那么好测,我就我就瞎写哈,我把最上面这个也写到下面去,我瞎写再执行。大家看也是为空啊,随便怎么改,把这一大坨再往下面拿一下。再往下面来一下,看看有没有问题。好走,再运行也没有报任何错误,好的,那这就是这段代码的修正,我把这一段代码修正过后的代码呢,给各位朋友放贷。把这个地方更新一下,原先是这段这段代码是吧,我把它删掉。
08:01
干脆我把整个这个表格拿掉。对不对,删除表格,我再重新加入一个表格代码就OK了。这点是需要同学们注意的。各位,这就是我们对这一个删除。就是删除二叉树二叉排序数节点的一个注意事项的补充。
我来说两句