PDA

View Full Version : مشکل BST



sayeh1991
جمعه 17 اردیبهشت 1389, 18:23 عصر
سلام
ببخشید من با حذف گره از درخت مشکل دارم.یعنی الگوریتمشو بلدم ولی نمیتونم اجراش کنم.میخوام از قسمتی که کامنته استفاده کنم لینک ارور میگیره...

#include<iostream>

using namespace std;
struct Node
{
int data;
Node* left;
Node* right;
Node* parent;
};
void Add(Node* & root, int x);
void Delete(Node*& root, int x);
Node* Find(Node* & root, int x);
bool IsLeaf(Node* & root, int x);
void InOrder(Node* root);

int main()
{
return 0;
}

void Add(Node* & root, int x)
{
if(root==NULL)
{
root=new Node;
root->data=x;
root->left=NULL;
root->right=NULL;
}
else
if(x>root->data)
Add(root,root->right->data);
else
Add (root,root->left->data);
}
/*
void Delete(Node*& root, int x)
{
if(IsLeaf(root,x))
{

}

bool IsLeaf(Node* root,int x)
{
Node*temp=Find(root,x);
if(temp->right==NULL && temp->left==NULL)
return true;
}*/

void InOrder(Node* root)
{
if(root=NULL)
return;
else
{
if(root->left)
InOrder(root->left);

if(root->right)
InOrder(root->right);
}
}

sayeh1991
جمعه 17 اردیبهشت 1389, 18:43 عصر
ببخشید
یه سوال دیگه هم در همین مورد داشتم
اگه یه نود از وسط درخت داشته باشیم چه طوری حذف و اضافه انجام بدیم؟؟:متفکر::متفکر::متفکر:

tdkhakpur
جمعه 17 اردیبهشت 1389, 18:47 عصر
به نظرم باید به شکل زیر باشه


void Delete(Node*& root, int x)
{
Node *tmp;
if(IsLeaf(root,x)){
tmp = root->parent;
if( tmp->left == root )
tmp->left = NULL;
else
tmp->right = NULL;
delete [] root;
}
}

tdkhakpur
جمعه 17 اردیبهشت 1389, 18:53 عصر
اگه یه نود از وسط درخت داشته باشیم چه طوری حذف و اضافه انجام بدیم؟؟
برای اضافه شدن مشکلی نیست فقط باید آدرس یالها را نگهداری کنید و به داده های یال جدید اضافه کنید و بعد از آن parent, left , right نود های قدیمی را update کنید.
ولی برای حذف باید یکی از یالهای نود مورد نظر شما NULL باشد تا قابل حذف شدن باشد.

sayeh1991
جمعه 17 اردیبهشت 1389, 18:55 عصر
خب تابعisleaf هم ارور میده...

tdkhakpur
جمعه 17 اردیبهشت 1389, 18:58 عصر
خب تابعisleaf هم ارور میده...

من delete شما رو اصلاح کردم ولی isleaf از تابع find استفاده میکند. ارور چی میده؟

sayeh1991
جمعه 17 اردیبهشت 1389, 19:05 عصر
همون لینک ارور...

tdkhakpur
جمعه 17 اردیبهشت 1389, 19:08 عصر
همون لینک ارور...

من متوجه منظورتان نشدم کدوم لینک؟

sayeh1991
جمعه 17 اردیبهشت 1389, 19:21 عصر
[linked eror]
undefinedrefence to Find

tdkhakpur
جمعه 17 اردیبهشت 1389, 19:27 عصر
[linked eror]
undefinedrefence to Find
خب تابع find رو نمیتواند پیدا کند باید قبل از همه توابعی که از آن استفاده میکنند تعریفش کنید.

sayeh1991
جمعه 17 اردیبهشت 1389, 19:32 عصر
ای وای ....اصلا حواسم نبود...مرسی

sayeh1991
جمعه 17 اردیبهشت 1389, 19:39 عصر
برای اضافه شدن مشکلی نیست فقط باید آدرس یالها را نگهداری کنید و به داده های یال جدید اضافه کنید و بعد از آن parent, left , right نود های قدیمی را update کنید.
ولی برای حذف باید یکی از یالهای نود مورد نظر شما NULL باشد تا قابل حذف شدن باشد.

درست متوجه نمیشم...از همون نود به بعد اضافه کنیم؟ میشه؟

tdkhakpur
شنبه 18 اردیبهشت 1389, 00:35 صبح
نه قبل از نود


void AddNewNode(Node* newnode, int x)
{
Node *ParentNode;
Node*CurNode=Find(root,x); // نود مورد نظر
if(CurNode!=NUL){
ParentNode = CurNode->parent;
CurNode->parent = newnode;
if( ParentNode->left==CurNode)
ParentNode->left = newnode;
else
ParentNode->right = newnode;
}
newnode->Parent = ParentNode;
newnode->data = x;
newnode->right = newnode->left = NULL;
if( newnode->data>CurNode->data)
newnode->left = CurNode;
else
newnode->right = CurNode;
}

دستی کد شد.