当前位置: 首页 > 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;
}
http://www.dtcms.com/a/84789.html

相关文章:

  • 【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
  • Python元组
  • LeetCode面试经典150题
  • 《网络安全等级测评报告模版(2025版)》
  • 点云分割方法
  • vue3:十一、主页面布局(实现基本左侧菜单+右侧内容效果)
  • 万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优
  • 对比学习(Contrastive Learning)初接触
  • 通过仿真确定抗积分饱和策略的最佳系数
  • 《TCP/IP网络编程》学习笔记 | Chapter 20:Windows 中的线程同步
  • JVM垃圾回收笔记01-垃圾回收算法