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

[树/链表/图] 从114. Flatten Binary Tree to Linked List展开兼谈Tree的传值问题

全局:

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

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

x
本帖最后由 Falldawn 于 2021-5-18 13:30 编辑

114. Flatten Binary Tree to Linked List

Tree的递归/DFS博大精深,出题千变万化,但是有一类解法可以攻破很多这种问题,而且适用于几乎所有Tree的Recursion题目,请大家多多加米,如何加米? 我这个楼的下方有“收藏”“评分”“淘贴”,请选择“评分”加米,多谢!
如果你看看我的总结帖子,会发现我总结的都是方法,是每类题的解法,而不是每个题的具体解法,原创不易。

需要从下层返回什么,我就返回什么
如果要返回多个值
如果类型相同,则用一个array即可;
如果类型不同,建一个class把所有值作为field放进去。
对于此题,需要链表的头和尾,这样才能把2个链表接上,所以用一个array即可。但要注意的是base case不要写错:就是只有一个节点时,头和尾均为此节点,否则如果尾是null,那就是null接下一个链表的头了,完全错误!!!

同样的方法轻松解决426题,而且特别清晰易懂,可以和面试官讲清楚,像Leetcode高票答案那种,第一很难理解,第二很不一定能和面试官解释清楚。
还有同学问我一个问题,他也是下面写法,但是他把一个res 的array作为参数传进函数里,问我为什么不对?这里简单说一下Java的传参,Java只有pass by value,如果是primitive type比如int 啊 a= 5,则传入的是这个a 的copy,等于是再copy出一个数5传入函数中,函数执行完根本不改变a的值。而如果是Object,则传入的是Object的地址的copy,所以在此地址上作出的内容改变都改变了Object的值,所以不能传一个array进去而且返回的还是这个array!!!


  1. public TreeNode flatten(TreeNode root) {
  2.    if (root == null || (root.left == null && root.right == null)) {
  3.      return root;
  4.    }
  5.       
  6.    helper(root);
  7.    return root;
  8. }

  9. private TreeNode[] helper(TreeNode node) {
  10.    TreeNode[] res = new TreeNode[2];
  11.    if (node == null) {
  12.      return res;
  13.    }

  14.    if (node.left == null && node.right == null) {
  15.      res[0] = node;
  16.      res[1] = node;
  17.      return res;
  18.    }

  19.    TreeNode[] right = helper(node.right);
  20.    TreeNode[] left = helper(node.left);
  21.    if (node.left == null) {
  22.      res[0] = node;
  23.      res[1] = right[1];
  24.      return res;
  25.    } else if (node.right == null) {
  26.      res[0] = node;
  27.      res[1] = left[1];
  28.      node.right = left[0];
  29.      node.left = null;
  30.      return res;
  31.    } else {
  32.      node.right = left[0];
  33.      left[1].right = right[0];
  34.      node.left = null;
  35.      res[0] = node;
  36.      res[1] = right[1];
  37.      return res;
  38.    }
  39. }
复制代码



426. Convert Binary Search Tree to Sorted Doubly Linked List

  1. public Node treeToDoublyList(Node root) {
  2.         Node[] r = flatten(root);
  3.         if (r[0] != null) {
  4.             r[0].left = r[1];
  5.             r[1].right = r[0];
  6.         }
  7.         return r[0];
  8.     }
  9.    
  10.     private Node[] flatten(Node root) {
  11.         if (root == null) return new Node[] {null, null};
  12.         Node[] left = flatten(root.left);
  13.         Node[] right = flatten(root.right);
  14.         Node first = root;
  15.         if (left[1] != null) {
  16.             left[1].right = root;
  17.             root.left = left[1];
  18.             first = left[0];
  19.         }
  20.         Node last = root;
  21.         if (right[0] != null) {
  22.             root.right = right[0];
  23.             right[0].left = root;
  24.             last = right[1];
  25.         }
  26.         return new Node[] {first, last};
  27.     }
复制代码






补充内容 (2021-05-19 12:18 +8:00):
第一题第一个函数内加一行TreeNode[] res = helper(root); return res[0]

评分

参与人数 6大米 +13 收起 理由
chi6340938 + 1 给你点个赞!
KlausYan + 2 谢谢分享!
2011051305 + 2 给你点个赞!
yyt913 + 5 欢迎来一亩三分地论坛!
两只西柚 + 1 赞一个

查看全部评分


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

本版积分规则

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