力扣117. 填充每个节点的下一个右侧节点指针 II

“递归”

  • 思路:
    • 基于节点,创建下一层(L + 1)节点的 next 指针:
      • 确定当前节点下一层节点 next 链表的起始节点,迭代到需要找非孩子的 next 节点时,根据其当层(L) next 链表的下一节点,将 L + 1 层的 next 节点指向 L 层 next 节点的非 nullptr 子节点;
      • 根据 L 层 next 链表迭代遍历完成 L + 1 层 next 链表的构建;
    • 依此迭代完成下一层的 next 链表;
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if (!root) {
            return nullptr;
        }

        Node* start = root;
        while (start) {
            Node* begin = nullptr;
            Node* nextStart = nullptr;
            for (Node *it = start; it != nullptr; it = it->next) {
                if (it->left) {
                    handle(begin, it->left, nextStart);
                }
                if (it->right) {
                    handle(begin, it->right, nextStart);
                }
            }

            start = nextStart;
        }

        return root;
    }

private:
    void handle(Node* &start, Node* &next, Node* &nextStart) {
        if (start) {
            start->next = next;
        }
        if (!nextStart) {
            nextStart = next;
        }

        start = next;
    }
};

你可能感兴趣的:(力扣实践,leetcode,算法,职场和发展)