mahdi.manian
چهارشنبه 13 خرداد 1394, 02:08 صبح
با عرض سلام.
بنده درخت bst را با استفاده از لیست های پیوندی طراحی کردم. برای درج و نمایش هیچ مشکلی وجود ندارد اما در قسمت حذف وقتی می خواهم گره فرزند را با پدر مقایسه کنم همیشه false هست و هیچ موقع true نمیشه.
برنامه را به صورت کامل در پایین قرار دادم. برای مثال در برنامه زیر اعداد 5 و 4 و 6 و 0 را وارد کنید. سپس به قسمت حذف بیایید و با زدن 6 اقدام به حذف 6 کنید. خواهید دید که مقایسه درست انجام نمی شود و اشتباهی یک گره دیگر را حذف می کند. ممنون میشوم راهنمایی کنید.
کدی که همیشه مقایسش درست انجام نمیشه: par->left==p
// BST_Tree.cpp : Defines the entry point for the console application.
// Designed by Mahdi Manian for mr.Mojtabaie
#include "stdafx.h"
#include "iostream"
using namespace std;
struct tree_node
{
int info;
tree_node *left, *right;
};
tree_node *par=NULL, *root=NULL;
void inorder(tree_node *root);
void insert_bst(tree_node *r, tree_node *p);
bool search_bst(tree_node *r, tree_node *p);
bool del_bst(tree_node *r, tree_node *p);
int _tmain()
{
tree_node *p=NULL;
while(true)
{
system("cls");
cout<<"1.Insert numbers and sorting"<<endl;
cout<<"2.Show sorted numbers"<<endl;
cout<<"3.Search and delete a number"<<endl;
cout<<"4.Exit"<<endl;
int s, n, c, key;
cin>>s;
switch(s)
{
case 1:
system("cls");
cin>>n;
while(n)
{
p=new(tree_node);
p->info=n;
p->left=p->right=NULL;
if(root==NULL)
root=p;
else
insert_bst(root, p);
cin>>n;
}
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 2:
system("cls");
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 3:
system("cls");
cout<<"Enter search key"<<endl;
cin>>key;
p=new(tree_node);
p->info=key;
p->left=p->right=NULL;
if(del_bst(root, p))
cout<<"Successful!"<<endl;
else
cout<<"Not Found!"<<endl;
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 4:
std::exit(0);
}
}
return 0;
}
void inorder(tree_node *root) {
if(!root)
return;
inorder(root->left);
cout<<root->info<<" ";
inorder(root->right);
}
void insert_bst(tree_node *r, tree_node *p) {
if(p->info < r->info)
if(r->left==NULL)
r->left=p;
else
insert_bst(r->left, p);
else
if(r->right==NULL)
r->right=p;
else
insert_bst(r->right, p);
}
bool search_bst(tree_node *r, tree_node *p) {
if(r)
{
if(r->info == p->info) {
//del_bst(par, r,);
p=r;
return true;
}
else if(p->info <r->info) {
par=r;
search_bst(r->left, p);
}
else {
par=r;
search_bst(r->right, p);
}
}
else
return false;
}
bool del_bst(tree_node *r, tree_node *p) {
bool flag=false;
if(!par)
par=r;
flag=search_bst(r,p);
if(flag) {
if(par->left==p) {
if(p->left==NULL)
par->left=p->right;
else
par->left=p->left;
}
else {
if(p->right)
par->right=p->right;
else
par->right=p->left;
}
}
return(flag);
}
بنده درخت bst را با استفاده از لیست های پیوندی طراحی کردم. برای درج و نمایش هیچ مشکلی وجود ندارد اما در قسمت حذف وقتی می خواهم گره فرزند را با پدر مقایسه کنم همیشه false هست و هیچ موقع true نمیشه.
برنامه را به صورت کامل در پایین قرار دادم. برای مثال در برنامه زیر اعداد 5 و 4 و 6 و 0 را وارد کنید. سپس به قسمت حذف بیایید و با زدن 6 اقدام به حذف 6 کنید. خواهید دید که مقایسه درست انجام نمی شود و اشتباهی یک گره دیگر را حذف می کند. ممنون میشوم راهنمایی کنید.
کدی که همیشه مقایسش درست انجام نمیشه: par->left==p
// BST_Tree.cpp : Defines the entry point for the console application.
// Designed by Mahdi Manian for mr.Mojtabaie
#include "stdafx.h"
#include "iostream"
using namespace std;
struct tree_node
{
int info;
tree_node *left, *right;
};
tree_node *par=NULL, *root=NULL;
void inorder(tree_node *root);
void insert_bst(tree_node *r, tree_node *p);
bool search_bst(tree_node *r, tree_node *p);
bool del_bst(tree_node *r, tree_node *p);
int _tmain()
{
tree_node *p=NULL;
while(true)
{
system("cls");
cout<<"1.Insert numbers and sorting"<<endl;
cout<<"2.Show sorted numbers"<<endl;
cout<<"3.Search and delete a number"<<endl;
cout<<"4.Exit"<<endl;
int s, n, c, key;
cin>>s;
switch(s)
{
case 1:
system("cls");
cin>>n;
while(n)
{
p=new(tree_node);
p->info=n;
p->left=p->right=NULL;
if(root==NULL)
root=p;
else
insert_bst(root, p);
cin>>n;
}
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 2:
system("cls");
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 3:
system("cls");
cout<<"Enter search key"<<endl;
cin>>key;
p=new(tree_node);
p->info=key;
p->left=p->right=NULL;
if(del_bst(root, p))
cout<<"Successful!"<<endl;
else
cout<<"Not Found!"<<endl;
cout<<"Sorted list is:"<<endl;
inorder(root);
cout<<endl<<"Do yout want to continue? 0/1"<<endl;
cin>>c;
if(c!=1)
std::exit(0);
break;
case 4:
std::exit(0);
}
}
return 0;
}
void inorder(tree_node *root) {
if(!root)
return;
inorder(root->left);
cout<<root->info<<" ";
inorder(root->right);
}
void insert_bst(tree_node *r, tree_node *p) {
if(p->info < r->info)
if(r->left==NULL)
r->left=p;
else
insert_bst(r->left, p);
else
if(r->right==NULL)
r->right=p;
else
insert_bst(r->right, p);
}
bool search_bst(tree_node *r, tree_node *p) {
if(r)
{
if(r->info == p->info) {
//del_bst(par, r,);
p=r;
return true;
}
else if(p->info <r->info) {
par=r;
search_bst(r->left, p);
}
else {
par=r;
search_bst(r->right, p);
}
}
else
return false;
}
bool del_bst(tree_node *r, tree_node *p) {
bool flag=false;
if(!par)
par=r;
flag=search_bst(r,p);
if(flag) {
if(par->left==p) {
if(p->left==NULL)
par->left=p->right;
else
par->left=p->left;
}
else {
if(p->right)
par->right=p->right;
else
par->right=p->left;
}
}
return(flag);
}