114.二叉树展开为链表

114. 二叉树展开为链表

题目

给定一个二叉树,原地将它展开为链表。
图片说明

题解

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

  • 先序遍历(深度优先搜索)
  • 中序遍历(深度优先搜索)(尤其二叉搜索树)
  • 后序遍历(深度优先搜索)
  • 层序遍历(广度优先搜索)(尤其按照层来解决问题的时候)
  • 序列化与反序列化(结构唯一性问题)

根据我们的观察,本题应该是使用深度优先搜索的方式来解决,我们看看是怎样变成一个列表的。如图所示:

图片说明

其实是分为三步:

  • 首先将根节点的左子树变成链表
  • 其次将根节点的右子树变成链表
  • 最后将变成链表的右子树放在变成链表的左子树的最右边

这就是一个递归的过程,递归的一个非常重要的点就是:不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出。对于函数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;
    }
}

图片说明

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务