• 【leetcode面试经典150题】74. 填充每个节点的下一个右侧节点指针 II(C++)


    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)

    【题目描述】

    给定一个二叉树:

    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

    初始状态下,所有 next 指针都被设置为 NULL 。

    【示例一】

    输入:root = [1,2,3,4,5,null,7]
    输出:[1,#,2,3,#,4,5,7,#]
    解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

    【示例二】

    输入:root = []
    输出:[]

    【提示及数据范围】

    • 树中的节点数在范围 [0, 6000] 内
    • -100 <= Node.val <= 100

    【代码】

    1. // 方法一:层次遍历
    2. class Solution {
    3. public:
    4. Node* connect(Node* root) {
    5. if (!root) {
    6. return nullptr;
    7. }
    8. queue q;
    9. q.push(root);
    10. while (!q.empty()) {
    11. int n = q.size();
    12. Node *last = nullptr;
    13. for (int i = 1; i <= n; ++i) {
    14. Node *f = q.front();
    15. q.pop();
    16. if (f->left) {
    17. q.push(f->left);
    18. }
    19. if (f->right) {
    20. q.push(f->right);
    21. }
    22. if (i != 1) {
    23. last->next = f;
    24. }
    25. last = f;
    26. }
    27. }
    28. return root;
    29. }
    30. };
    31. // 方法二:使用已建立的 next 指针
    32. class Solution {
    33. public:
    34. void handle(Node* &last, Node* &p, Node* &nextStart) {
    35. if (last) {
    36. last->next = p;
    37. }
    38. if (!nextStart) {
    39. nextStart = p;
    40. }
    41. last = p;
    42. }
    43. Node* connect(Node* root) {
    44. if (!root) {
    45. return nullptr;
    46. }
    47. Node *start = root;
    48. while (start) {
    49. Node *last = nullptr, *nextStart = nullptr;
    50. for (Node *p = start; p != nullptr; p = p->next) {
    51. if (p->left) {
    52. handle(last, p->left, nextStart);
    53. }
    54. if (p->right) {
    55. handle(last, p->right, nextStart);
    56. }
    57. }
    58. start = nextStart;
    59. }
    60. return root;
    61. }
    62. };
  • 相关阅读:
    Java FilterWriter类的简介说明
    AtCoder Beginner Contest 354 (ABCDEFG题)视频讲解
    c语言:初识指针
    【单目3D目标检测】SMOKE + MonoFlex 论文解析与代码复现
    【Android笔记36】使用Android实现一个简易版本的购物车小案例(登录注册功能)
    html 常见兼容性问题
    C语言实现动态版本的通讯录
    揭秘网络安全攻防战:信息收集和密码破解的黑客技巧与防护策略
    NR 5G RRC Setup Request
    第十二章 Spring Cloud Config 统一配置中心详解-客户端动态刷新
  • 原文地址:https://blog.csdn.net/m0_74172965/article/details/138174931