107. Recorrido de secuencia del árbol binario II

107. Recorrido de secuencia del árbol binario II

Descripción del Título

Dado un árbol binario, devuelve el recorrido ascendente de sus valores de nodo. (Es decir, desde la capa donde se encuentra el nodo hoja hasta la capa donde se encuentra el nodo raíz, atravesando de izquierda a derecha capa por capa)

Por ejemplo:
dado un árbol binario [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

Devuelve su recorrido de secuencia ascendente como:

[
  [15,7],
  [9,20],
  [3]
]

responder:

Esta pregunta también tiene dos formas de pensar:

  1. Secuencia transversal de árbol binario de referencia , la secuencia normal a través de los resultados para revertir
  2. No utilice el orden inverso, esto es un poco problemático.

No escribo en orden inverso, en la secuencia transversal del árbol binario , según los resultados devueltos en orden inverso en la línea.

A continuación se describe cómo escribir en orden no inverso:

  • Encuentra la altura del árbol binario total_dep
  • La matriz resultante retse establece en total_depuna matriz vacía
  • Proceso recursivo, asume la profundidad actual de recursividad dep(comenzando en 1), el nodo de capa pertenece a retla primera total_dep - depfila

Complejidad del tiempo: O (n) O (n)O ( n )

Complejidad de espacio adicional: O (n) O (n)O ( n )

/**
 * 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 {
    
    
public:
    vector<vector<int>> ret;
    int total_dep;
    int depth( TreeNode* root ) {
    
    
        if ( !root ) return 0;
        return 1 + max( depth( root->left ), depth( root->right) );
    }
    void dfs( TreeNode* root, int dep ) {
    
    
        if ( !root ) return;
        ret[total_dep - dep].emplace_back( root->val );
        dfs( root->left, dep + 1 );
        dfs( root->right, dep + 1 );
    }
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
    
    
        total_dep = depth( root );
        for ( int i = 0; i < total_dep; ++i ) 
            ret.emplace_back( vector<int>{
    
    } );
        dfs( root, 1 );
        return ret;
    }
};
/*
时间:0ms,击败:100.00%
内存:11.4MB,击败:71.52%
*/

Por supuesto, el método de secuencia transversal de árbol binario de referencia , una nueva matriz que se inserta en la cabeza puede ser:ret

/**
 * 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 {
    
    
public:
    vector<vector<int>> ret;
    void dfs( TreeNode* root, int dep ) {
    
    
        if ( !root ) return;
        if ( ret.size() < dep ) 
            ret.insert( ret.begin(), vector<int>{
    
    } );
        ret[ret.size() - dep].emplace_back( root->val );
        dfs( root->left, dep + 1 );
        dfs( root->right, dep + 1 );
    }
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
    
    
        dfs( root, 1 );
        return ret;
    }
};
/*
时间:28ms,击败:7.87%
内存:12.3MB,击败:6.92%
*/

Pero la eficiencia es conmovedora. . .

Supongo que te gusta

Origin blog.csdn.net/MIC10086/article/details/113810807
Recomendado
Clasificación