题目

将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。

 注意事项

不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。

样例
              1
               \
     1          2
    / \          \
   2   5    =>    3
  / \   \          \
 3   4   6          4
                     \
                      5
                       \
                        6

解题

修改前序遍历

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param root: a TreeNode, the root of the binary tree
     * @return: nothing
     * 前序遍历:根左右
     * 修改根的right指向左部分
     * 左部分的right指向右部分
     */
    public void flatten(TreeNode root) {
        // write your code here
        // 空结点
        if(root == null)
            return;
        // 左右结点都空
        if(root.left==null && root.right==null)
            return;
        // 左结点空
        if(root.left==null){
            TreeNode right = root.right;
            flatten(right);
            return;
        }
        // 右节点空
        if(root.right==null){
            TreeNode left = root.left;
            root.right = left;
            
            flatten(left);
            root.left = null;// left结点设置为空
            return;
        }
        // 左右结点都不空
        TreeNode left = root.left;
        TreeNode right = root.right;
        root.right = left; 
        
        flatten(left);
        
        TreeNode p = left;
        while(p.right!=null){ // 找到left部分的最右结点
            p = p.right;
        }
        p.right = right;
        flatten(right);
        
        root.left = null; // left结点设置为空
        return;
    }
}