114. 二叉树展开为链表
-
解题思路:
- 对于这类递归问题,采用「宏观」思考模式。
- 对于任意一个节点A,左子树先「展开为链表」,右子树再「展开为链表」,然后A节点,将左子树的结果,和右子树的结果,「串在一起」即可。
- 左子树展开为链表,所以要返回两个节点,一个是链表的头,然后是链表的尾。
-
代码
/** * 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); } };
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!