453. 将二叉树拆成链表
将一棵二叉树按照前序遍历拆解成为一个 假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
样例
样例 1:
输入:{1,2,5,3,4,#,6}
输出:{1,#,2,#,3,#,4,#,5,#,6}
解释:
1
/ \
2 5
/ \ \
3 4 6
1
\
2
\
3
\
4
\
5
\
6
样例 2:
输入:{1}
输出:{1}
解释:
1
1
挑战
不使用额外的空间耗费。
注意事项
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
public void flatten(TreeNode root) {
// write your code here
helper(root); // root对象是传引用
}
// 返回整棵树最后一个节点,这样方便主函数的两个子树相连
private TreeNode helper(TreeNode root) {
if (root == null)
return null;
TreeNode leftLast = helper(root.left);
TreeNode rightLast = helper(root.right);
if (leftLast != null) {
leftLast.right = root.right; // 左子树的末尾连到右子树
root.right = root.left; // 根节点连到左子树
root.left = null; // 别忘了把左子树设置为null
}
// 连接好成一个单链之后,整棵树的最后一个节点就是rightLast
if (rightLast != null)
return rightLast;
// rightLast == null
if (leftLast != null)
return leftLast;
// 左右子树都为空
return root;
}