J'ai un problème avec des arbres binaires de recherche.
La fonction pour effacer un élement ne marche pas (c'est la fonction del()).
Quant je veux effacer un noeud qui a 2 feuilles, il met un zéro à la place de supprimer le noeud. Je rappelle del() à la fin de la fonction del() et ca plante.

Voici le code source (seul la fonction del() pose problème) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
 
#include <iostream>
#include <stdlib.h>
using namespace std;
 
// the node struct
struct Node {
  int value;
  Node *left;
  Node	*right;
};
 
// search an element
bool search(int wert, Node *node)
{
	if(node!=NULL){
		if(node->value==wert) return true; // found
		if(node->value < wert) // wert bigger=>right
		{
			if(node->right==NULL) return false;
			return search(wert,node->right);
		}
		if(node->value > wert) // wert smaller=>left
		{
			if(node->left==NULL) return false;
			return search(wert,node->left);
		}
 
 
 
	}
	// else false (not found)
	return false;
}
 
// insert a element
bool insert(int wert, Node *&node)
{
	// while we have not a leaf
	while(node!=NULL)
	{
		if (node->value > wert) return insert(wert, node->left); // wert smaller=>left
		if (node->value < wert) return insert(wert, node->right); // wert bigger=>right
		if(node->value==wert) return false; // we have soon this element
	}
 
	node = new Node; // create a new node
	node->value = wert; // put the wert
	return true;
}
 
// FONCTION OU SE TROUVE LE PROBLEME
bool del(int wert, Node *&node)
{
 
  if (node == NULL) return false;
 
  Node* tmp = node;
 
  if (node->value > wert) {
    return del(wert, node->left);
  } else {
    if (node->value < wert) {
      return del(wert, node->right);
    } else {
      if (node->value == wert) {
 
        if (node->left == NULL) {
          node = node->right;
          delete tmp;
        } else {
 
          if (node->right == NULL) {
            node = node->left;
            delete tmp;
          } else {
 
            tmp = node->left;
            while (tmp->right!=NULL) tmp=tmp->right;
 
            node->value = tmp->value;
           // cette appel ne se fait pas correctement
            del(tmp->value, tmp);
          }
        }
      }
    }
  }
  return true;
}
 
 
 
// inorder (left, display, right)
void inorder(Node *node, int t=0)
{
	if (node!=NULL)
	{
		inorder(node->left,t+1);
		int i;
		for(i=0;i<t;i++) cout<<" ";
		cout<<node->value<<endl;
		inorder(node->right,t+1);
	}
}
 
// preorder (display, left, right)
void preorder(Node *node, int t=0)
{
	if (node!=NULL)
	{
		int i;
		for(i=0;i<t;i++) cout<<" ";
		cout<<node->value<<endl;
		preorder(node->left,t+1);
		preorder(node->right,t+1);
	}
}
 
// postorder (left, right, display)
void postorder(Node *node)
{
	if (node!=NULL)
	{
		postorder(node->left);
		postorder(node->right);
		cout<<node->value<<endl;
	}
}
 
// main function
int main()
{
	Node *bintree = NULL; // a tree node
	int elem = 0; // the number to search, insert, ...
	string cmd; // the instructions
	// loop for instructions
	do
	{
		elem=0;
		cout<<"$ ";
		cin>>cmd;
		// search an element
		if (cmd == "search"){
			cout<<"element? ";
			cin>>elem;
			if (search(elem, bintree)==true) cout<<"element found"<<endl;
			else cout<<"element not found"<<endl;
		// insert a element
		} else if (cmd == "insert"){
			cout<<"element? ";
			cin>>elem;
			if (insert(elem, bintree)==true) cout<<"element inserted"<<endl;
			else cout<<"we have soon this element"<<endl;
		// delete an element
		} else if (cmd == "delete"){
			cout<<"element? ";
			cin>>elem;
			if (del(elem, bintree)==true) cout<<"element deleted"<<endl;
			else cout<<"we have not this element"<<endl;
		// the 3 types of display
		} else if(cmd == "inorder"){
			cout<<"display :"<<endl;
			inorder(bintree);
		} else if(cmd == "preorder"){
			cout<<"display :"<<endl;
			preorder(bintree);
		} else if(cmd == "postorder"){
			cout<<"display :"<<endl;
			postorder(bintree);
		// if quit => the tree must be empty
		} else if(cmd == "quit") cout<<"end of the program"<<endl;
		// else false
		else cout<<"this command doesn't exist"<<endl;
	}
	while(cmd != "quit"); //end do while
	return 0;
}
Merci