递归保存当前结点的左右结点,遇到的左结点直接拼到右节点,左节点遍历完之后回溯,找到当前最底层的右结点,再将右节点拼接过去。两个版本
一 有返回值
public TreeNode build(TreeNode root){
if (root == null) return null;
TreeNode left = root.left;
TreeNode right = root.right;
root.left = null;
root.right = build(left);
TreeNode tmp = root;
while (tmp.right != null) tmp = tmp.right;
tmp.right = build(right);
return root;
}
public void flatten(TreeNode root) {
build(root);
}
无返回值
public void flatten(TreeNode root) {
if (root == null) return;
TreeNode left = root.left;
TreeNode right = root.right;
root.left = null;
root.right = left;
flatten(left);
TreeNode tmp = root;
while (tmp.right != null) tmp = tmp.right;
tmp.right = right;
flatten(right);
}