Given a binary tree, flatten it to a linked list in-place.
For example,
Given
Given
1 / \ 2 5 / \ \ 3 4 6
1 \ 2 \ 3 \ 4 \ 5 \ 6
这道题让我疑惑了半个上午,现在还是似懂非懂的状态,那就写下来捋一捋思路吧。
需要用到前度遍历,自父节点起先处理左孩子,再处理右孩子。左孩子链接到root.right,右孩子链接到root.right.right。递归即可。先是这样写了一下,然后出现Overflow错误,问题出现在哪儿呢?我的传递进去的参数是TreeNode root,然后递归中的处理一直都是基于root,相当于对root反复进行操作,并没有如愿DFS。怎么办!
再引入一个变量,lastNode,来记录每一层要处理的节点。然后基于lastNode来处理。
上代码,
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private TreeNode lastNode = null;
public void flatten(TreeNode root) {
if(root == null)
return ;
if(lastNode != null) {
lastNode.left = null;
lastNode.right = root;
}
lastNode = root;
TreeNode right = root.right;
flatten(root.left);
flatten(right);
}
}
我们初始定义lastNode为null,进入递归,赋予root;对lastNode进行处理,相当于对root处理,左孩子置为null,右孩子置为root,相当于第一层;然后分别遍历左右孩子树。
明天需要再回顾一下这道题。
没有评论:
发表评论