Почему модификация возвращаемой пары из рекурсивного вызова разбивает мое решение в последовательной последовательности C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему модификация возвращаемой пары из рекурсивного вызова разбивает мое решение в последовательной последовательности

Сообщение Anonymous »

Я пытаюсь решить самую длинную проблему последовательной последовательной последовательности II (LeetCode 549). Цель состоит в том, чтобы найти длину самого длинного последовательного пути (увеличивающегося или уменьшения) в двоичном дереве. Путь может идти в обоих направлениях (ребенок → родитель → ребенок), а не только вниз. Вот код, который не работает: < /p>
class Solution {
public:
int maxLen = 0;

pair toNode(TreeNode *node) {
if (!node) return {0, 0};

pair linc(0, 0), rdec(0, 0);

if (node->left) {
linc = toNode(node->left);
if (node->left->val - 1 == node->val) {
linc.second++;
}
if (node->left->val + 1 == node->val) {
linc.first++;
}
}

if (node->right) {
rdec = toNode(node->right);
if (node->right->val - 1 == node->val) {
rdec.second++;
}
if (node->right->val + 1 == node->val) {
rdec.first++;
}
}

int inc = max(1, max(linc.first, rdec.first));
int dec = max(1, max(linc.second, rdec.second));
maxLen = max(maxLen, inc + dec - 1);
return {inc, dec};
}

int longestConsecutive(TreeNode* root) {
toNode(root);
return maxLen;
}
};

< /code>
Теперь эта версия не дает правильного результата для всех тестовых случаев. Однако, когда я рефактирую его, как ниже - вычислять вкл и uc отдельно, не мутируя рекурсивные возвратные значения - он работает нормально: < /p>
class Solution {
public:
int maxLen = 0;
pair toNode(TreeNode *node){
if(!node)return {1, 1};
pairlinc(0, 0), rdec(0, 0);

int lic=0, lid=0, ric=0, rid=0;

if(node->left){
linc = toNode(node->left);
if(node->left->val == node->val-1)lid = linc.second+1;
if(node->left->val == node->val+1)lic = linc.first+1;
}

if(node->right){
rdec = toNode(node->right);
if(node->right->val == node->val-1)rid = rdec.second+1;
if(node->right->val == node->val+1)ric = rdec.first+1;
}

int inc = max(1, max(lic , ric));
int dec = max(1, max(lid, rid));

int cur = inc + dec - 1;

maxLen = max(cur, maxLen);
return {inc, dec};

}
int longestConsecutive(TreeNode* root) {
toNode(root).first;
return maxLen;
}
};

< /code>
Вопрос < /strong>
Почему первая версия стерла, даже если я увеличиваю значения пары (linc.first ++ или linc.second ++) на основе условий? Я явно не использую возвращенную пару где -либо еще, поэтому я ожидал, что эта мутация будет безопасной.[3, null, 4, null, 1, null, 2]
< /code>
ожидаемый результат: 2

my -код возвращает: 3

demo < /p>

Подробнее здесь: https://stackoverflow.com/questions/796 ... olution-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»