首页 > 其他分享 >114. 二叉树展开为链表

114. 二叉树展开为链表

时间:2024-11-15 20:19:18浏览次数:1  
标签:head right TreeNode nullptr 链表 114 二叉树 left

  1. 题目链接

  2. 解题思路:

    • 对于这类递归问题,采用「宏观」思考模式。
    • 对于任意一个节点A,左子树先「展开为链表」,右子树再「展开为链表」,然后A节点,将左子树的结果,和右子树的结果,「串在一起」即可。
    • 左子树展开为链表,所以要返回两个节点,一个是链表的头,然后是链表的尾。
  3. 代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        // 将head展开成链表
        pair<TreeNode*, TreeNode*> process(TreeNode *head) {
            if (head == nullptr) {
                return {nullptr, nullptr};
            }
            TreeNode *left_head = nullptr;     // 左链表的头
            TreeNode *left_tail = nullptr;     // 左链表的尾
            TreeNode *right_head = nullptr;    // 右链表的头
            TreeNode *right_tail = nullptr;    // 右链表的尾
            auto left_res = process(head->left);
            auto right_res = process(head->right);
            left_head = left_res.first;
            left_tail = left_res.second;
            right_head = right_res.first;
            right_tail = right_res.second;
            TreeNode *cur_head = head;
            TreeNode *cur_tail = head;
            if (left_head != nullptr) {
                cur_tail->right = left_head;
                cur_tail = left_tail;
                head->left = nullptr;   // 不要忘记这一句
            }
            if (right_head != nullptr) {
                cur_tail->right = right_head;
                cur_tail = right_tail;
            }
            
            return {cur_head, cur_tail};
        }
    
        void flatten(TreeNode* root) {
            process(root);
        }
    };
    

标签:head,right,TreeNode,nullptr,链表,114,二叉树,left
From: https://www.cnblogs.com/ouyangxx/p/18548587

相关文章

  • 617. 合并二叉树
    题目链接解题思路分情况讨论即可两个头都是空,直接返回空若root1为空,直接返回root2若roo2为空,直接返回root1若都不空,则二者相加,得到一个新节点A,然后二者的左子树去合并,得到一个新左子树new_left,二者的右子树去合并,得到一个新右子树new_right,然后新节点的左儿子就是new_......
  • 104. 二叉树的最大深度
    题目链接解题思路普通的递归可能很简单,但是,现在要求,使用「二叉树递归套路」来思考问题每个节点需要什么信息?如果根节点,能够有一个「最大深度」的信息,那么直接返回就可以了。那么,这个信息可以通过左子树信息+右子树信息得到吗?max(左子树最大深度,右子树最大深度)+1......
  • 102. 二叉树的层序遍历
    题目链接解题思路层序遍历就是用队列,本题需要一层一层收集答案,所以我们可以用一个变量cur,表示该层还剩多少节点需要收集,同时,遇到一个节点,还要将其孩子节点放入队尾。那么我们怎么知道下一层的节点个数,所以还需要一个变量next,记录下一层的节点个数。总结一遍:每次从队头......
  • 【C++】list 类深度解析:探索双向链表的奇妙世界
    ......
  • LeetCode654.最大二叉树
    LeetCode刷题记录文章目录......
  • 【数据结构副本篇】顺序表 链表OJ
    ......
  • 提问:如何实现,我在docker container中,curl localhost:11434时,实际访问的是宿主机的1143
    背景我们需要在dify中配置ollama。ollama服务起来之后,会把服务挂在localhost的11434上。但是,我的dify一般是在docker里起的。所以我在dockercontainer里,访问localhost:11434时,实际无法访问到宿主机的11434,也就没办法调用宿主机上的ollama。怎么解决?方法一:找到宿主机......
  • C语言双相循环链表增删查改(带头节点)
    C语言双相循环链表增删查改(带头节点)最后一个节点的next指针指向第一个节点,第一个节点的prev指针指向最后一个节点定义链表节点#include<stdio.h>#include<stdlib.h>//内存管理,malloc(size_tsize)//链表节点结构体typedefstructNode{intdata;s......
  • 241114 noip 模拟赛
    省流:\(90+100+20+10\)。t1t2花太久时间了。T1题意:给一张\(n\timesm\)的网格图,\((x,y)\)与\((x+1,y)\)的边为\(a_x+b_y\),\((x,y)\)与\((x,y+1)\)的边为\(c_x+d_y\)。求这张图的最小生成树的边权和。\(n,m\leq10^6\)。稍微画图注意到,一个点一定跟它......
  • 数据结构 ——— 利用前序序列重建链式二叉树
    目录题目要求链式二叉树示意图​编辑代码实现 题目要求读入用户输入的一串前序遍历的字符串,根据此字符串建立一个链式二叉树例如前序遍历的字符串为:ABC##DE#G##F###;其中"#"表示空树链式二叉树示意图以此图的链式二叉树为例子那么此链式二叉树前序遍历转换为字符......