思路:先利用DFS的思路找到最左子节点,然后回到其父节点,把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上,然后再把原右子节点连到新右子节点的右子节点上,然后再回到上一父节点做相同操作。
public static void flatten(TreeNode root) {
if(root!=null){
flatten(root.l);
flatten(root.r);
TreeNode tmp = root.r;
root.r = root.l;
root.l = null;
while (root.r!=null){
root = root.r;
}
root.r = tmp;
}
}
非递归如下:
public static void flatten(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
while (root!=null || !stack.isEmpty()){
while (root!=null){
stack.add(root);
root = root.l;
}
if(!stack.isEmpty()){
root = stack.pop();
TreeNode tmp = root.r;
root.r = root.l;
root.l = null;
while (root.r!=null){
root = root.r;
}
root.r = tmp;
root = root.r;
}
}
}