【Lintcode】 87. Supprimer le nœud dans l'arborescence de recherche binaire

Adresse du titre:

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

Étant donné un BST et un nombre v une l u e valeur nécessite que le noeud égal à la valeur soit supprimé dans le BST et que la racine supprimée soit renvoyée.

L'idée est d'utiliser la récursivité. Si la racine de l'arbre n'est pas égale à v a l u e valeur , puis supprimez récursivement le sous-arbre gauche ou le sous-arbre droit en fonction de la relation de taille avec la racine de l'arbre et connectez-le à la racine. Sinon, si la racine de l'arbre est égale à v a l u e valeur , si l'un des sous-arbres gauche et droit est vide, puis renvoie directement la racine du sous-arbre non vide, sinon les sous-arbres gauche et droit ne sont pas vides, alors nous pouvons remplacer la valeur maximale dans le sous-arbre gauche, racine, Supprimez ensuite la valeur maximale. Étant donné que la valeur maximale du sous-arbre gauche doit être à l'extrémité droite de ce sous-arbre et que le sous-arbre droit de ce nœud est vide, il est très pratique de le supprimer. Le code est le suivant:

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;
    }
}

Complexité spatio-temporelle O ( h ) Oh)

Publié 387 articles originaux · aimé 0 · 10,000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/qq_46105170/article/details/105465516
conseillé
Classement