【Lintcode】 87. Eliminar nodo en árbol de búsqueda binaria

Dirección del título:

https://www.lintcode.com/problem/remove-node-in-binary-search-tree/description

Dado un BST y un número v un l u e valor requiere que el nodo igual al valor se elimine en el BST, y se devuelve la raíz eliminada.

La idea es usar la recursividad. Si la raíz del árbol no es igual a v a l u e valor , luego elimine recursivamente el subárbol izquierdo o el subárbol derecho de acuerdo con la relación de tamaño con la raíz del árbol y conéctelo a la raíz. De lo contrario, si la raíz del árbol es igual a v a l u e valor , si uno de los subárboles izquierdo y derecho está vacío, devuelve directamente la raíz del subárbol no vacío; de lo contrario, los subárboles izquierdo y derecho no están vacíos, entonces podemos sobrescribir el valor máximo en el subárbol izquierdo, raíz, Luego elimine el valor máximo. Como el valor máximo del subárbol izquierdo debe estar en el extremo derecho de este subárbol y el subárbol derecho de este nodo está vacío, es muy conveniente eliminarlo. El código es el siguiente:

public class Solution {
    /*
     * @param root: The root of the binary search tree.
     * @param value: Remove the node with given value.
     * @return: The root of the binary search tree after removal.
     */
    public TreeNode removeNode(TreeNode root, int value) {
        // write your code here
        if (root == null) {
            return root;
        }
        
        if (root.val < value) {
            root.right = removeNode(root.right, value);
        } else if (root.val > value) {
            root.left = removeNode(root.left, value);
        } else {
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            } else {
            	// 开两个节点,一个节点在前,另一个跟在后面
                TreeNode prev, cur;
                prev = cur = root.left;
                cur = cur.right;
                // 如果root的左子树的右子树已经为空了,那么直接把左子树的左子树连到root上即可;
                // 否则就删掉左子树的最右端的节点即可
                if (cur == null) {
                    root.val = prev.val;
                    root.left = prev.left;
                } else {
                    while (cur.right != null) {
                        cur = cur.right;
                        prev = prev.right;
                    }
                    root.val = cur.val;
                    prev.right = cur.left;
                }
            }
        }
        
        return root;
    }
}

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int x) {
        val = x;
    }
}

Complejidad espacio-tiempo O ( h ) Oh)

Publicado 387 artículos originales · me gusta 0 · 10,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/qq_46105170/article/details/105465516
Recomendado
Clasificación