Binary Recherche Arbre - Supprimer

voix
1

Je suis en train d'écrire un programme qui prend dans les chaînes et les place dans un arbre de recherche binaire dans l'ordre alphabétique, une fois ceux-ci sont insérés dans l'arbre, un utilisateur invite à entrer un mot à supprimer, en supprimant ainsi ce nœud de l'arbre, puis l'arbre de sortie sans ce noeud dans l'ordre.

Tout fonctionne pour cette fonction jusqu'à la suppression, la fonction de suppression fonctionne, mais son très bizarre comment il supprime. Je pense actuellement qu'il supprime un côté complet de l'arbre, parce que quand je supprime le dernier mot, cela fonctionne généralement. Je vais télécharger ma fonction de suppression et s'il en faut plus que je peux télécharger le reste de mon code.

Merci!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Créé 31/03/2011 à 03:24
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Votre cas pour être soit à gauche ou à droite NULLsont bonnes. Cependant, votre logique pour aucun d'entre eux étant NULL, malheureusement, à défaut.

Si je lis votre code (et la compréhension de la fonction replace_parent()correctement, si aucun arbre est vide , vous remplacez la racine actuelle avec Left.

Demandez - vous - ce qui se passe aux valeurs qui sont Rightsous - arbre?

Ce que vous devez faire pour supprimer un nœud est la suivante:

  1. Entrez l' un des sous - arbres. On dirait que vous avez choisi votre Leftsous - arbre, donc nous allons partir de là.
  2. Suivre la face ligne de branches. Dans cet exemple, continuez vers le bas les Rightsous - arbres de votre original Left. Continuez jusqu'à ce que vous trouviez un nœud feuille droit (pas de Rightsous - arbres, Leftest OK)
  3. Rappelez - vous la valeur de votre feuille droite dans une tmpvariable.
  4. Transférer le droit de feuilles Left(que ce soit NULLou non) à la position de la droite feuille.
  5. Prenez la tmpvaleur et la mettre dans votre noeud « à supprimer » d' origine.
Créé 31/03/2011 à 03:38
source utilisateur

voix
2

Lacqui est correct dans ses points.

laissez-moi vous dire vous que la suppression d'un nœud dont vous avez besoin de le remplacer par le nœud max dans l'arbre secondaire gauche ou le nœud minimum dans l'arbre à droite sous. par exemple: si vous voyez l'image ci-dessous: entrez la description d'image ici

si vous voulez supprimer le nœud 90, vous devez prendre soin que vous le remplacer par soit 80 qui est son nœud max dans le sous-arbre gauche ou le 92 que le nœud minimum dans l'arbre à droite sous. vous pouvez garder une approche.

de sorte que le algo sera: compte tenu de l'arbre secondaire vers la gauche:

-> si vous trouvez le nœud à supprimer, accédez à la valeur maximale dans son sous-arbre gauche.

-> assign la gauche du nœud 50 et à droite de nœud à 150

-> faire 75-> suivant comme nul et supprimer 90

Créé 18/04/2011 à 11:22
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more