LeetCode BST Topic 538 Conversión de un árbol de búsqueda binario en un árbol acumulativo java

Detalles de la pregunta

Dado el nodo raíz del árbol de búsqueda binaria, el valor del nodo del árbol es diferente, conviértalo a un árbol de suma mayor, de modo que el nuevo valor de cada nodo sea igual o mayor que el nodo del árbol original. suma de los valores de val.
Inserte la descripción de la imagen aquí

Ideas y códigos para la resolución de problemas

Esta pregunta es BST. Tenemos que ser claros sobre BST. El recorrido en orden es generar una secuencia ordenada de números de pequeño a grande. (Para el recorrido de orden medio, BST puede ver el recorrido de preorden, orden medio, postorden del árbol binario (& BST), recursividad e iteración, java )
Entonces, el nuevo valor de cada punto aquí es el actual valor + todos los valores mayores que el valor actual, si tenemos una secuencia de números ordinales, el nuevo valor del punto es: comenzando desde el valor anterior y acumulando hasta el final.
Por supuesto, no tenemos que atravesar primero en el orden medio, luego acceder a la matriz y luego atravesarla y modificarla nuevamente, lo cual es demasiado problemático.
Acumulamos directamente desde el último de la secuencia ordinal al valor anterior.
¿Cómo ir de atrás hacia adelante? Simplemente invierta el recorrido de orden medio.

En el recorrido de orden medio, estamos

void dfs(TreeNode root) {
    
    
    dfs(root.left);
    visit(root);
    dfs(root.right);
}

Aquí lo invertimos, primero a la derecha, luego a la izquierda.

El código específico es el siguiente:

class Solution {
    
    
    private int sum = 0;
    public TreeNode convertBST(TreeNode root) {
    
    
        //每个数的新值就是其父节点、父节点的右子树(如果有父节点的话)+右子节点的和
        //中序遍历的话是从小到大的有序对吧,如果我把中序的左和右改一下,是不是就是从大到小遍历了
        //然后每个点的值就是自己+之前的sum
        //应该就是这样
        // int sum = 0;
        dfs(root);
        return root;
    }

    public void dfs(TreeNode node){
    
    
        if(node==null){
    
    
            return;
        }
        dfs(node.right);
        sum += node.val;
        node.val = sum;
        dfs(node.left);
        return;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_34687559/article/details/109393292
Recomendado
Clasificación