方法一、将前序遍历的结果存入ArrayList,再遍历list构建链表
class Solution {
List<TreeNode> res= new ArrayList<>();
public void flatten(TreeNode root) {
preOrder(root);
for (int i = 1; i <res.size(); i++) {
TreeNode prev = res.get(i - 1), curr = res.get(i);
prev.right=curr;
prev.left=null;
}
}
private void preOrder(TreeNode root){
if(root==null) return;
res.add(root);
preOrder(root.left);
preOrder(root.right);
}
}
方法二、递归寻找前驱节点
左子树根节点的前驱节点是根节点,右子树的前驱节点是左子树的最右节点
一、寻找前驱节点,将前驱节点的right指针指向当前节点
1.把左子树的最右节点的right指针指向右子树的根节点(右子树根节点的前驱节点是左子树最右侧的节点)
2.再把根的right指针指向左子树的根节点。(左子树根节点的前驱节点是根节点root)
二、循环遍历节点并展开
根移动到右节点,依次循环到null也就是右子树的底部
class Solution {
public void flatten(TreeNode root){
while(root!=null){
//1.寻找左子树的最右节点,指向右子树的根节点
TreeNode move = root.left;
while(move!=null&&move.right!=null) move=move.right;
if (move != null) {
move.right=root.right;
//2.把根的right指针指向左子树的根节点
root.right=root.left;
root.left=null;
}
root=root.right;
}
}
}