2015年10月11日星期日

#LeetCode# Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place.
For example,
Given
         1
        / \
       2   5
      / \   \
     3   4   6
The flattened tree should look like:
   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,相当于第一层;然后分别遍历左右孩子树。

明天需要再回顾一下这道题。

没有评论:

发表评论