当前位置: 首页 > news >正文

力扣刷题记录-二叉树展开为链表

力扣刷题记录-二叉树展开为链表

题目描述

给定一个二叉树,原地将它展开为一个单链表。展开后的单链表应该同样使用 TreeNode,其中 right 子指针指向链表中下一个结点,而 left 子指针始终为 null

解题思路

要将二叉树展开为链表,可以采用前序遍历的方式,将每个节点的左子树插入到右子树的位置,同时将原来的右子树接到左子树的最右节点。

具体步骤如下:

  1. 前序遍历:遍历二叉树的每个节点。
  2. 展开操作
    • 如果当前节点的左子树不为空,找到左子树的最右节点。
    • 将当前节点的右子树接到左子树的最右节点。
    • 将当前节点的左子树移动到右子树的位置,并将左子树置为 null
  3. 递归处理:对每个节点重复上述操作,直到所有节点处理完毕。

代码实现

以下是 C++ 的实现代码:

#include <iostream>

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
public:
    void flatten(TreeNode* root) {
        if (!root) return;

        // 展开左子树
        flatten(root->left);
        // 展开右子树
        flatten(root->right);

        // 保存右子树
        TreeNode* right = root->right;
        // 将左子树移到右子树的位置
        root->right = root->left;
        root->left = nullptr;

        // 找到当前右子树的最右节点
        TreeNode* curr = root;
        while (curr->right) {
            curr = curr->right;
        }
        // 将原来的右子树接到最右节点
        curr->right = right;
    }
};

// 辅助函数:打印展开后的链表
void printFlattenedTree(TreeNode* root) {
    while (root) {
        std::cout << root->val << " ";
        root = root->right;
    }
    std::cout << std::endl;
}

int main() {
    // 构建示例二叉树
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(5);
    root->left->left = new TreeNode(3);
    root->left->right = new TreeNode(4);
    root->right->right = new TreeNode(6);

    Solution solution;
    solution.flatten(root);

    // 打印展开后的链表
    printFlattenedTree(root);

    return 0;
}

相关文章:

  • 【2025】基于springboot+vue的教务/课程/成绩管理系统设计与实现(源码、万字文档、图文修改、调试答疑)
  • Agent Team 多智能体系统解析
  • Python 魔术方法深度解析:__getattr__ 与 __getattribute__
  • Springboot之RequestContextHolder 学习笔记
  • CANFD芯片在辐射环境中的技术演进
  • 【数学建模】最大最小值模型详解
  • Spring的基本用法
  • 服务器负载均衡
  • 机器学习——Numpy的神奇索引与布尔索引
  • JWT 认证机制
  • 第十三章 : Names in Templates_《C++ Templates》notes
  • 使用Gitee Go流水线部署个人项目到服务器指南
  • 稳定运行的以Oracle NoSQL数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 2025年01月03日微创网络(杭州银行外包)前端面试
  • 香橙派连接摄像头过程
  • 深入剖析 RocketMQ 的 ConsumerOffsetManager
  • RK3568开发笔记-egtouch触摸屏ubuntu系统屏幕校准
  • vue3中,通过获取路由上的token直接进入首页,跳过登录页面
  • 【前端 vue 或者麦克风,智能语音识别和播放功能】
  • python八股(—) --FBV,CBV
  • 受贿数额特别巨大、滥用职权,国家烟草专卖局原局长凌成兴一审被判十六年
  • 中国代表:美国才是南海安全稳定的最大威胁
  • “阳光下的守护”法治公安主题宣传活动在京启动:突出为民服务宣传
  • 时隔5个月,辽沈银行行长再调整
  • 宋鹍已任首都机场集团有限公司董事长、党委书记
  • 西安市长安区与航天基地区政合一管理,党政一把手分任基地党工委正副书记