查看: 1991| 回复: 16
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 请教一下关于空指针null的问题,为什么每次都要先检查null呢?

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
下面是Leetcode #226 Revert tree这道题目的recursion做法。
我一开始根本没有想到要检查null,不知道为什么这个步骤是必要的呢?可以请大神讲一下原理吗?感谢!

  1. class Solution {
  2.     public TreeNode invertTree(TreeNode root) {
  3.         if (root == null) {
  4.             return null; //为什么要先检查null呢?
  5.         }
  6.         TreeNode left = invertTree(root.right);
  7.         TreeNode right = invertTree(root.left);
  8.         root.left = left;
  9.         root.right = right;
  10.         return root;
  11.     }
  12. }
复制代码





补充内容 (2020-8-25 08:55):
已解决~地里的大神太多了!谢谢大家!

上一篇:遇到限制内存的follow up怎么做?
下一篇:leetcode 双周赛 ac 打卡留念
全局:
如果没有这个条件就死循环了啊。这个就相当于一个递归出口,也就是base case。还有就是如果递归到一个节点,是null的话,后面也会出现null pointer exception,因为null是不能被dereference的。
回复

使用道具 举报

全局:
本帖最后由 lujingyang1029 于 2020-8-24 13:23 编辑

递归的思想, 主问题可以分解成两个子问题,树的左子树 和右子树;root.left and root.right;
TreeNode left= invertTree(root.left) 返回invert 好的左子树跟节点;
TreeNode right = invertTree(root.right) 返回invert 好的右子树跟节点;

这两个子问题和主问题的联系就是通过 root.left = right 和 root.right = left 完成整个问题的解决;

问题的终止条件就是当子问题的输入是null的时候(通过有限次操作就能完成)就返回;
回复

使用道具 举报

全局:
递归 + memorization 的三个部分

1. 递归停止条件 (没有这个条件,递归会无限进行)
这个条件就是你说的检查null
当然,你也可以用左右孩子都为空 这种写法

2. memorization
检查当前情况是否处理过。如果处理过,则直接返回。
这个适用于所有可以dp的题

3. 计算
遇到没见过的条件,用递归的方式计算所有子问题的解,然后合并所有子问题的解。如果有memorization,在返回前把计算结果存入memory
回复

使用道具 举报

全局:
递归要有截止条件啊,你没有left right 的时候,left right就是null啊
回复

使用道具 举报

🔗
 楼主| liuzz10 2020-8-23 07:45:52 | 只看该作者
全局:
不知道小帅 发表于 2020-8-22 15:38
如果没有这个条件就死循环了啊。这个就相当于一个递归出口,也就是base case。还有就是如果递归到一个节点 ...

哦,是说到叶节点的时候,左右孩子为null,这种case时就return null来终止循环吗?
回复

使用道具 举报

🔗
 楼主| liuzz10 2020-8-23 07:49:20 | 只看该作者
全局:
沙场小兵 发表于 2020-8-22 15:42
递归 + memorization 的三个部分

1. 递归停止条件 (没有这个条件,递归会无限进行)

原来如此,再请问一下return null之后有什么后果呢?会把叶结点的左右孩子赋值为null吗,还就只是单纯退出了循环不产生任何影响呢?谢谢
回复

使用道具 举报

🔗
 楼主| liuzz10 2020-8-23 07:51:43 | 只看该作者
全局:
vicfunkk 发表于 2020-8-22 15:34
递归要有截止条件啊,你没有left right 的时候,left right就是null啊

谢谢!原来这里指的是叶结点的左右孩子呀
回复

使用道具 举报

全局:
liuzz10 发表于 2020-8-23 07:45
哦,是说到叶节点的时候,左右孩子为null,这种case时就return null来终止循环吗?

其实叶节点的左右孩子赋值为null就相当于没有影响,但是也不仅仅是叶子节点,有些节点可能只有一边是null,这种情况下这个base case也是可以处理的
回复

使用道具 举报

🔗
 楼主| liuzz10 2020-8-23 08:26:07 | 只看该作者
全局:
不知道小帅 发表于 2020-8-22 16:09
其实叶节点的左右孩子赋值为null就相当于没有影响,但是也不仅仅是叶子节点,有些节点可能只有一边是null ...

原来如此,所以退出循环的原因是因为return了something,这个循环到头了。

如果是一边null一边不是的话,那null那边就到头了,然后没有null的那边还有继续参与循环。

谢谢谢谢!
回复

使用道具 举报

🔗
bzoot 2020-8-23 08:36:37 | 只看该作者
全局:
所有人都在讲递归算法…我第一反应是如果不检测null,null.right会报错…
遍历tree是不断寻找节点的子节点。这里的递归方法采用的是节点自身不检测是否存在子节点,继续递归,由新的节点自己检测自己是不是存在(null也是一个节点,是一个不存在的节点,不存在的节点自然也不会有子节点)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表