suppression dans un arbre de recherche binaire

voix
5

J'ai donné deux arbres binaires de recherche. Par exemple, A et B. Ensuite, on m'a demandé de supprimer l'arbre B de l'arbre A.

Par suppression, je veux dire supprimer tous les noeuds présents dans B de A. Note: B est pas nécessairement une sous-arborescence de A.

par exemple:
A:

      50   
     / \  
    10  75  
   /   / \  
  1   60   90                 

B:

     10
     / \
    1   75

arbre résultant devrait être:

     50
       \
        60
         \ 
          90

Deux approches sont venus à l' esprit:
A1:
noeud * deleteTree (noeud * A, noeud * B);
Prendre la racine de l' arbre B. supprimer ce noeud d'arbre A (par la méthode de suppression normale BST). Diviser ensuite le problème en deux parties - pour le sous - arbre gauche de B et le sous - arbre droit de B. Pour chacun des sous - arbre, récursion. Pour le sous - arbre gauche, le nœud qui occupait le noeud qui a été supprimé devrait servir de racine pour arbre A. Pour le sous - arbre droit, le successeur de envue du nœud supprimé doit serveur comme la racine pour l' arbre A.

A2: L'autre approche est un peu bizarre. Je trouve le afinde et pré-commande de l'arbre A. traversal Trouver et supprimer tous les noeuds dans l'arbre B en utilisant la recherche binaire avec récursion (nous ne modifier le pré-commande). Enfin recostruct notre bst du afinde (restant) et la pré-commande (inchangé).

PROB A: Trouver un moyen efficace pour BST.
Prob B: Trouver un moyen efficace pour tout arbre binaire (non seulement BST).

Créé 31/08/2011 à 10:06
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

La façon dont je le vois, pourquoi ne pas vous faire un parcours infixe de b. Ensuite, jusqu'à ce que le tableau ne soit pas vide, faire régulièrement supprimer d'une pour la valeur de l'indice de tableau. Traversal est O (n) et de suppression pour chaque index sera O (logn). Au total, cette opération sera O (nlogn).

Créé 31/08/2011 à 10:27
source utilisateur

voix
6

problème A

Je suppose que les deux arbres sont équilibrés.

void deleteTree(node* A, node* B)
{
    if(A == NULL || B == NULL)
        return;

    if(A->data == B->data)
    {
        deleteTree(A->left, B->left);
        deleteTree(A->right, B->right);
        removeNode(A); // Normal BST remove
    }
    else if(A->data > B->data)
    {
        Node* right = B->right;
        B->right = NULL;
        deleteTree(A->left, B);
        deleteTree(A, right);
    }
    else // (A->data < B->data)
    {
        Node* left = B->left;
        B->left = NULL;
        deleteTree(A->right, B);
        deleteTree(A, left);
    }
}

complexité du temps:

T(N) = 2 * T(N / 2) + O(1)

Ainsi , la complexité globale est O (N) selon le théorème maître. La complexité de l' espace est O (1) . Un inconvénient est que je DESTRUCTED B.

PS: Je n'ai pas la mise en œuvre de BST à portée de main, donc je ne peux pas tester le code pour vous. Mais je pense que l'idée est correcte.

problème B

Utilisez table de hachage pour un arbre et traverser une autre. Vous obtiendrez O (N) pour le temps et la complexité de l' espace.

Créé 31/08/2011 à 14:12
source utilisateur

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