Cho một cây nhị phân, nhiệm vụ là đếm số lượng cây con giá trị đơn nhất (uni-value subtrees). Một cây con được gọi là giá trị đơn nhất khi tất cả các nút trong cây con đó có cùng một giá trị.
Ví dụ minh họa
Đầu vào: root = [5,1,5,5,5,null,5]

Đầu ra: 4
Thuật toán giải quyết
Ta sử dụng phương pháp đệ quy (DFS) pós-order (hậu tự) để kiểm tra từng cây con:
- Định nghĩa hàm
solve(node)trả vềtruenếu cây con gốc tạinodelà uni-value. - Nếu
nodelà null, trả vềtrue(cây rỗng mặc định thỏa mãn). - Gọi đệ quy cho nút con trái (
left) và nút con phải (right). - Nếu bất kỳ cây con trái hoặc phải nào không phải uni-value, trả về
false. - Nếu nút con trái tồn tại và giá trị của nó khác giá trị nút hiện tại, trả về
false. - Nếu nút con phải tồn tại và giá trị của nó khác giá trị nút hiện tại, trả về
false. - Nếu vượt qua các kiểm tra trên, tăng biến đếm
retlên 1 và trả vềtrue. - Từ hàm chính, khởi tạo
ret = 0, gọisolve(root)và trả vềret.
Triển khai C++
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int data) {
val = data;
left = NULL;
right = NULL;
}
};
class Solution {
public:
int ret = 0;
bool solve(TreeNode* node) {
if (!node) return true;
bool left = solve(node->left);
bool right = solve(node->right);
if (!left || !right) return false;
if (node->left && node->val != node->left->val) return false;
if (node->right && node->val != node->right->val) return false;
ret++;
return true;
}
int countUnivalSubtrees(TreeNode* root) {
ret = 0;
solve(root);
return ret;
}
};
Độ phức tạp
- Thời gian: O(n) - duyệt qua từng nút đúng một lần.
- Không gian: O(h) - độ sâu đệ quy tối đa bằng chiều cao cây (h), trong trường hợp xấu nhất O(n).
Kết quả kiểm thử
Đầu vào: {5,1,5,5,5,NULL,5}
Đầu ra: 4