刷题笔记

简介: ## 一、题目描述:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例 1:

一、题目描述:

给你二叉树的根结点 root ,请你将它展开为一个单链表:

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

img

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:

输入:root = []
输出:[]
示例 3:

输入:root = [0]
输出:[0]

提示:

树中结点数在范围 [0, 2000] 内
-100 <= Node.val <= 100

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

对于任意一棵子树,根节点为root,通过flat这个递归方法展开为链表,并返回链表的尾部节点,具体过程如下:

如果根节点为null,或者是叶子节点,则它的尾节点为其自身。

否则,首先将左子树展开为链表,返回左子树链表的尾部节点tailLeft。然后将右子树展开为链表,返回右子树链表的尾部节点tailRight。

递归解法总体步骤:

  1. 严格按照递归函数定义
  2. 递归左右子树
  3. 从根节点遍历至最右下结点
  4. 最后拼接原来的右子树

三、AC 代码:

class Solution {
    public void flatten(TreeNode root) {
        if (root == null) {
            return ;
        }

        // 后序遍历模板
        flatten(root.left);
        flatten(root.right);

        TreeNode right = root.right;
        TreeNode left = root.left;
        root.left = null;
        root.right = left;
        // 遍历到最右下结点,拼接右子树
        TreeNode p = root;
        while (p.right != null) {
            p = p.right;
        }
        p.right = right;
    }
}
相关文章
|
存储 算法 C语言
日常刷题篇(入门)
我从简单到难,一起走上漫漫刷题路! 我会持续在我的博客中更新我每天刷题的内容! 相互交流!
日常刷题篇(入门)
我从简单到难,一起走上漫漫刷题路! 我会持续在我的博客中更新我每天刷题的内容! 相互交流!
|
Web App开发 前端开发
牛客前端宝典——刷题 ##Day4
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
150 0
牛客前端宝典——刷题 ##Day4
|
前端开发 容器
牛客前端宝典——刷题 ##Day7
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
131 0
牛客前端宝典——刷题 ##Day7
|
前端开发 JavaScript 程序员
牛客前端宝典——刷题 ##Day3
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
134 0
牛客前端宝典——刷题 ##Day3
|
JavaScript 前端开发 数据安全/隐私保护
牛客前端宝典——刷题 ##Day1
🏆编程就像我们平常做题一样,如果只是一味的学习不去做题的话所得到的效果微乎其微。
134 0
牛客前端宝典——刷题 ##Day1