惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
IT之家
IT之家
Y
Y Combinator Blog
T
Tailwind CSS Blog
B
Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
InfoQ
J
Java Code Geeks
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
博客园 - 司徒正美
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog

博客园 - 新西兰程序员

C++ 构造函数中的初始化参数列表initializer list C++中的线程thread,以及C++11中的std::atomic学习 Leetcode56 Merge Intervals 合并区间 -- C++实现 C++中的内存对齐 C++中的static关键字使用以及全局变量 C++17中的结构化绑定Structured Binding C++中的函数参数是指针类型, 是按值传递 C++中异常处理机制中的栈展开stack unwinding C++实现链表反转 Linux中的性能分析工具 perf 来分析C++性能 C++17中新建一个类时,编译器默认生成的类成员函数 QT中的元对象系统 Leetcode65 有效数字 - 判断给定的字符串是否是一个有效数字 LettCode2289-Steps to Make Array Non-descreasing C#中的委托详解 C++中的std::function C++中的仿函数Functor C++中的const和constexpr异同比较 C++中的左值和右值,以及右值引用,移动语义 C++中传递参数是指针类型以及传入参数是指针的指针(**)详解 C++中GetTickCount函数学习 C++中以类的成员函数作为Windows callback函数需要设置成static函数 C#中的System.Security.SecureString学习 C++中的悬挂指针和野指针 C++中四种不同的对象生存方式(in stack, in heap, global, local static) C#中使用Parallel类来进行多线程并发编程 String类型转LPCTSTR -----理解C++中的字符串类型转换 C++中的虚函数和虚函数表 C++中基类指针指向派生类对象 数据结构 - 栈的学习
Leetcode 114 - 二叉树展开为链表
新西兰程序员 · 2025-07-23 · via 博客园 - 新西兰程序员

这道题是要把一个二叉树,展开为一个单链表, 它的要求有2点

1. 展开后的单链表也同样适用TreeNode, 这个单链表左子指针始终为null, 右子指针指向链表中的下一个结点

2. 展开后的单链表应该与二叉树的先序遍历(先根遍历,也就是 根节点->左节点->右节点)顺序相同

 拿到这个题目后,我们来看看,应该怎么入手,我们以上面这颗比较简单的二叉树为例来看看。

根节点1 -> 它的左子树,按照先序遍历,遍历完成后,应该是 2->3->4

根节点1 -> 它的右子树,按照先序遍历,遍历完成后,应该是5->6

再对比最后需要的结果,我们就能发现规律

1. 把根节点的左子树先序遍历完成后,作为一个新的节点(2->3->4), 挂在原来的根节点root(根节点1)的右边,作为她的右子节点

 2. 把根节点的右子树先序遍历完成后,作为一个新的节点(5->6),挂在第1步产生的新的节点的右边,作为它的右子节点

image

 整个过程完成

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
        
        if(root == null) 
           return;
   
        var left = root.left;
        var right = root.right;

        flatten(root.left);
        flatten(root.right);

       root.left = null;
       root.right = left;

        var p = root;
        while (p.right != null) {
            p = p.right;
        }
        p.right = right;


    }
}