高级农民
- 积分
- 2646
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-1-21
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
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!!!
- public TreeNode flatten(TreeNode root) {
- if (root == null || (root.left == null && root.right == null)) {
- return root;
- }
-
- helper(root);
- return root;
- }
- private TreeNode[] helper(TreeNode node) {
- TreeNode[] res = new TreeNode[2];
- if (node == null) {
- return res;
- }
- if (node.left == null && node.right == null) {
- res[0] = node;
- res[1] = node;
- return res;
- }
- TreeNode[] right = helper(node.right);
- TreeNode[] left = helper(node.left);
- if (node.left == null) {
- res[0] = node;
- res[1] = right[1];
- return res;
- } else if (node.right == null) {
- res[0] = node;
- res[1] = left[1];
- node.right = left[0];
- node.left = null;
- return res;
- } else {
- node.right = left[0];
- left[1].right = right[0];
- node.left = null;
- res[0] = node;
- res[1] = right[1];
- return res;
- }
- }
复制代码
426. Convert Binary Search Tree to Sorted Doubly Linked List
- public Node treeToDoublyList(Node root) {
- Node[] r = flatten(root);
- if (r[0] != null) {
- r[0].left = r[1];
- r[1].right = r[0];
- }
- return r[0];
- }
-
- private Node[] flatten(Node root) {
- if (root == null) return new Node[] {null, null};
- Node[] left = flatten(root.left);
- Node[] right = flatten(root.right);
- Node first = root;
- if (left[1] != null) {
- left[1].right = root;
- root.left = left[1];
- first = left[0];
- }
- Node last = root;
- if (right[0] != null) {
- root.right = right[0];
- right[0].left = root;
- last = right[1];
- }
- return new Node[] {first, last};
- }
复制代码
补充内容 (2021-05-19 12:18 +8:00):
第一题第一个函数内加一行TreeNode[] res = helper(root); return res[0] |
上一篇: 微软近期高频面试题分享 + 分析(五)下一篇: 大家是怎么形成自己的代码风格的?
|