Leetcode 114-二叉树展开为链表

题解参考自Leetcode

方法一、将前序遍历的结果存入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;
            
        }
 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值