LC114.二叉树展开为链表

题目

查看题目

思路

本题需要将二叉树转化为列表,对于二叉树的题目,无非就以下几种解题思路:

  • 先序遍历(深度优先搜索)

  • 中序遍历(深度优先搜索)(尤其二叉搜索树)

  • 后序遍历(深度优先搜索)

  • 层序遍历(广度优先搜索)(尤其按照层来解决问题的时候)

  • 序列化与反序列化(结构唯一性问题)
    根据我们的观察,本题应该是使用深度优先搜索的方式来解决,我们看看是怎样变成一个列表的。如图所示:
    图解
    其实是分为三步:

  • 首先将根节点的左子树变成链表

  • 其次将根节点的右子树变成链表

  • 最后将变成链表的右子树放在变成链表的左子树的最右边
    这就是一个递归的过程,递归的一个非常重要的点就是:** 不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出 (非常重要!!不要纠结里面到底是怎样行运作,知道这个的总体使用结果是什么,不要跳进递归,跳进去一定出不来,耶稣来了都没有,最强大脑也撑不住几次压栈和出栈)**。对于函数flatten来说:

函数作用:将一个二叉树,原地将它展开为链表
输入:树的根节点
输出:无
那我们就直接根据三步来写程序就可以了

class Solution {
    public void flatten(TreeNode root) {
        if(root == null){
            return ;
        }
        //将根节点的左子树变成链表
        flatten(root.left);
        //将根节点的右子树变成链表
        flatten(root.right);
        TreeNode temp = root.right;
        //把树的右边换成左边的链表
        root.right = root.left;
        //记得要将左边置空
        root.left = null;
        //找到树的最右边的节点
        while(root.right != null) root = root.right;
        //把右边的链表接到刚才树的最右边的节点
        root.right = temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值