Una breve aplicación de la recursividad.

En primer lugar, aquí hay una pregunta simple que verifica brevemente la idea de escribir una pregunta recursiva en este artículo que publiqué antes  . La usaré para explicar la idea de esta pregunta:

La espada apunta a la Oferta 27 y al método 226. Voltear el árbol binario

Se le proporciona el nodo raíz de un árbol binario  root , voltea el árbol binario y devuelve su nodo raíz. 

1. ¿Cuándo se operan los datos?

Después de analizar el problema, encontramos que los subárboles izquierdo y derecho de cada nodo deben intercambiarse. Siempre que nos aseguremos de que al intercambiar los subárboles izquierdo y derecho del nodo actual, no operemos nuestro propio nodo, entonces podemos realice una operación recursiva o un intercambio de retroceso. Lo que elijo aquí es la operación de retroceso, primero recurro al punto más profundo y luego retrocedo a cualquier nodo, simplemente intercambio sus subárboles izquierdo y derecho.

2. ¿Qué se debe devolver en una función recursiva? 

 Esta es la idea de análisis en  mi artículo  sobre cómo escribir preguntas recursivas :

Mire esta pregunta, lo que finalmente devolvemos es el nodo principal del árbol invertido, y las operaciones de voltear los nodos se pueden completar durante el proceso recursivo o el proceso de retroceso, por lo que no necesitamos devolver ningún valor (aquí está mi De Por supuesto, hay otras ideas que requieren nodos de retorno, usted mismo puede entenderlas), en resumen, pertenece a la cuarta situación;

3. Decidir la condición de rescisión y ¿qué debemos devolver?

La situación de terminación de recursividad de esta pregunta es que la recursividad llega a la parte más profunda del árbol, es decir, cuando el nodo actual es nulo, regresa; simplemente finaliza este nivel de recursividad. (Debido a que elegimos el caso 4 anterior, no necesitamos devolver el valor y simplemente finalizarlo directamente)

En resumen, el código es el siguiente:

    public TreeNode mirrorTree(TreeNode root) {
        if (root==null){
            return null;
        }
        digui(root);//递归过程中对树结构操作,无需返回值
        return root;
    }

    void digui(TreeNode root) {
        if (root==null){
            return;
        }
        digui(root.left);
        digui(root.right);//递归函数在具体操作上面,属于先递归,回溯时操作数据
        TreeNode treeNode=root.left;
        root.left = root.right;
        root.right = treeNode;
        return;
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_52394141/article/details/131334165
Recomendado
Clasificación