Cho cây nhị phân hoàn chỉnh (complete binary tree), kết nối con trỏ next của mỗi nút sang nút bên phải cùng cấp.
Thuật toán giải quyết (Duyệt theo cấp không dùng queue)
Tương tự bài II nhưng tận dụng tính chất cây hoàn chỉnh: mọi nút đều có 2 con hoặc 0 con.
pre = root,nextPre = prev = nullptr.- Trong khi
pre:- Duyệt linked list cấp hiện tại:
- Nối
pre->leftvàpre->rightvào cấp dưới quaprev/nextPre. pre = pre->next.
- Nối
pre = nextPre, resetnextPre = prev = nullptr.
- Duyệt linked list cấp hiện tại:
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int val;
Node *left, *right, *next;
Node() : val(0), left(nullptr), right(nullptr), next(nullptr) {}
Node(int v, Node* l, Node* r) : val(v), left(l), right(r), next(nullptr) {}
};
class Solution {
public:
Node* connect(Node* root) {
Node *pre = root, *nextPre = nullptr, *prev = nullptr;
while (pre) {
while (pre) {
if (pre->left) {
if (prev) prev->next = pre->left;
else nextPre = pre->left;
prev = pre->left;
}
if (pre->right) {
if (prev) prev->next = pre->right;
else nextPre = pre->right;
prev = pre->right;
}
pre = pre->next;
}
pre = nextPre;
nextPre = prev = nullptr;
}
return root;
}
};
Đầu vào
[1,2,3,4,5,6,7]
Đầu ra
[1, #, 2, 3, #, 4, 5, 6, 7, #, ]