Diretório do artigo
Descrição do problema
Dada uma árvore binária, você precisa encontrar o comprimento do caminho de sequência contínua mais longo na árvore binária.
Observe que o caminho pode estar aumentando ou diminuindo. Por outro lado, o caminho pode estar em uma ordem filho-pai-filho, não necessariamente em uma ordem pai-filho.
Relatório de solução de problemas
- A partir do nó raiz, percorra os nós filhos esquerdo e direito em sequência.
- Retorna a sequência crescente mais longa e a sequência decrescente mais longa iniciando em cada nó .
inc
dec
- Se o valor do filho esquerdo for menor que o valor atual, o nó atual e o filho esquerdo formarão uma sequência descendente,
dec
atualize paraleft_child(dec)+1
; se o valor do filho esquerdo for maior que o valor atual, o nó atual e o filho esquerdo formarão uma sequência ascendente,inc
atualize paraleft_child(inc)+1
- Faça o mesmo para a criança certa.
Complexidade do tempo: . A árvore inteira será atravessada novamente.
Complexidade do espaço: . No pior dos casos, a profundidade da árvore é 。
Código de implementação
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
// 如何确定起点 根节点——》左节点
class Solution {
private:
int maxval=0;
public:
int longestConsecutive(TreeNode* root) {
longstPath(root);
return maxval;
}
pair<int,int>longstPath(TreeNode* root){
if(root==NULL){
return {0,0};
}
int inc=1,dec=1;
if(root->left!=NULL){
pair<int, int> l=longstPath(root->left);
if(root->val==root->left->val+1)
dec=l.second+1;
else if(root->val==root->left->val-1)
inc=l.first+1;
}
if(root->right!=NULL){
pair<int, int> r=longstPath(root->right);
if(root->val==root->right->val+1)
dec=max(dec,r.second+1);
else if(root->val==root->right->val-1)
inc=max(inc,r.first+1);
}
maxval=max(maxval,inc+dec-1);
return {inc,dec};
}
};