Giả sử chúng ta có một cây nhị phân; chúng ta phải tìm độ dài của Đường đi liên tiếp dài nhất trong Cây nhị phân đó. Ở đây đường dẫn có thể tăng hoặc giảm. Vì vậy, như một ví dụ [1,2,3,4] và [4,3,2,1] đều được coi là một đường dẫn hợp lệ, nhưng đường dẫn [1,2,4,3] không phải là một đường dẫn hợp lệ.
Nếu không, đường dẫn có thể theo trình tự con-Cha-con, trong đó không nhất thiết phải là thứ tự cha-con.
Vì vậy, nếu đầu vào giống như
thì đầu ra sẽ là 3 vì đường dẫn liên tiếp dài nhất sẽ giống như [1, 2, 3] hoặc [3, 2, 1].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một hàm giải quyếtUtil (), hàm này sẽ sử dụng nút,
-
nếu nút là null, thì -
-
trả lại {0, 0}
-
-
left =giải quyếtUtil (bên trái của nút)
-
left =giải quyếtUtil (bên phải của nút)
-
Xác định tạm thời một cặp:={1,1}
-
nếu bên trái của nút có mặt và giá trị bên trái của nút giống với giá trị của nút + 1, thì -
-
temp.first:=tối đa của temp.first và 1 + left.first
-
ans:=tối đa ans và temp.first
-
-
nếu bên phải của nút có mặt và giá trị của bên phải của nút giống với giá trị của nút + 1, thì -
-
temp.first:=tối đa của temp.first và 1 + right.first
-
ans:=tối đa ans và temp.first
-
-
nếu bên trái của nút có mặt và giá trị bên trái của nút giống với giá trị của nút - 1, thì -
-
temp.second:=tối đa temp.second và 1 + left.second
-
ans:=tối đa ans và temp.second
-
-
nếu bên phải của nút có mặt và giá trị của bên phải của nút giống với giá trị của nút - 1, thì -
-
temp.second:=tối đa của temp.second và 1 + right.second
-
ans:=tối đa ans và temp.second
-
-
ans:=tối đa là {ans và temp.first + temp.second - 1}
-
trở lại nhiệt độ
-
Từ phương thức chính, hãy làm như sau -
-
ans:=0
-
giải quyết (root)
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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 ans = 0;
pair<int, int> solveUtil(TreeNode* node){
if (!node) {
return { 0, 0 };
}
pair<int, int> left = solveUtil(node->left);
pair<int, int> right = solveUtil(node->right);
pair<int, int> temp = { 1, 1 };
if (node->left && node->left->val == node->val + 1) {
temp.first = max(temp.first, 1 + left.first);
ans = max(ans, temp.first);
}
if (node->right && node->right->val == node->val + 1) {
temp.first = max(temp.first, 1 + right.first);
ans = max(ans, temp.first);
}
if (node->left && node->left->val == node->val - 1) {
temp.second = max(temp.second, 1 + left.second);
ans = max(ans, temp.second);
}
if (node->right && node->right->val == node->val - 1) {
temp.second = max(temp.second, 1 + right.second);
ans = max(ans, temp.second);
}
ans = max({ ans, temp.first + temp.second - 1 });
return temp;
}
int longestConsecutive(TreeNode* root){
ans = 0;
solveUtil(root);
return ans;
}
};
main(){
Solution ob;
TreeNode *root = new TreeNode(2);
root->left = new TreeNode(1);
root->right = new TreeNode(3);
cout << (ob.longestConsecutive(root));
} Đầu vào
TreeNode *root = new TreeNode(2); root->left = new TreeNode(1); root->right = new TreeNode(3);
Đầu ra
3