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