ورود

نسخه کامل مشاهده نسخه کامل : کمک برای ایجاد درخت باینری



saeed_136915
13-05-2011, 00:18
سلام دوستان من میخوام یه درخت باینری رو از ورودی بگیرم و اون رو بصورت لیست پیوندی ذخیره کنم. ولی چون برای هر گره یا هر برگ درخت باید یه اسمی گذاشت نمیتونم کدش رو بنویسم. چیکار میتونم بکنم؟؟

mohsen_7
13-05-2011, 10:33
قسمت اول صحبتتون مشخصه و نوشتن برنامش هم زیاد کار خاصی نداره اما متوجه نامگذاری کردن برگها یا گره ها نشدم. یعنی میخواهید فیلدی به عنوان نام برای نگهداری نام هر برگ داشته باشید؟

saeed_136915
13-05-2011, 10:45
سلام ممنون از جوابت :20:
کد برای ایجاد یه گره اینه :

struct node{
node *left;
int data;
node *right;
};


من وقتی میخوام از ورودی مثلا 10 تا گره بگیرم باید به هرکدوم یه اسمی بدم که مشکلم اینجاس

mohsen_7
13-05-2011, 10:58
سلام دوست عزیز
نیازی به اسم دهی نیست. شما فقط کافیه آدرس ریشه رو بفرستی به تابعی که میخواهی این عمل رو انجام بده و بعدش همزمان با پیمایش درخت گره های لیست رو میسازی و محتویات هر گره رو داخل یک نود از لیست قرار میدی.

saeed_136915
13-05-2011, 11:17
میشه کد اون قسمت ساخت گره های لیست رو بنویسین؟ :46:

mohsen_7
13-05-2011, 11:26
با زبان سی یا سی پلاس پلاس؟

mohsen_7
13-05-2011, 11:41
برای ساختن یک گره و مقدار دهی به فیلد داده ای در سی پلاس پلاس میتونید به شکل زیر عمل کنید. اگر بیشتر از این بخواهید دیگه باید کله برنامش رو براتون بنویسم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

---------- Post added at 12:41 PM ---------- Previous post was at 12:40 PM ----------

شما سعی کنید برنامش رو بنویسید بعد اگه مشکلی بود مطرح کنید تا حلش کنیم. موفق باشید

saeed_136915
13-05-2011, 12:36
آقا دستت درد نکنه فکر کنم متوجه شدم ولی وقتی اینو مینویسم ایراد میگیره :



cin>>treeNode->data;

mohsen_7
13-05-2011, 13:46
خواهش میکنم.

دستوری که نوشتی ایرادی نداره. باید ببینیم چه خطایی میده. خطایی که اعلام میکنه رو بگو تا بررسی کنم.

saeed_136915
13-05-2011, 20:25
این چرا نمیشه آخه :41::19:
از صبح نشستم پای کامپیوتر یه جاشو درست میکنی جای دیگه خراب میشه.
اگه ممکنه قسمتی که درخت رو میگیره و تو لیست پیوندی ذخیره میکنه رو واسم بزارین.

mohsen_7
13-05-2011, 22:24
شما کاری که تا الان کردی رو اینجا بذار تا بهت بگم کجای کارت ایراد داره. چیز خاصی نیست مطمئن باش حل میشه.

اصلا سخت نگیر، برنامه نویسی همینه. من خودم شده چند روز واسه دو سه خط کد الکی دور خودم چرخیدم تا آخرش راه حل رو پیدا کردم. :41: :46:

saeed_136915
14-05-2011, 16:12
سلام آقا اگه امکانش هست اینو ببینین اشکالش کجییه :31:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define NULL 0L
using namespace std;

int pow(int x,int y)
{
int i=0,result=1;
for(i=y;i>0;i--)
result=result*x;
return result;
}
int calclevel(int MAX)
{
int i=0,level=0;
for(i=MAX;i>0;i--)
{
level++;
i=((i-1)/2);
}
return level;
}
struct node {
int data;
node *left;
node *right;
};

void link(node* parent,node* child,int j)
{
if(j%2!=0)
parent->left=child;
else
parent->right=child;
}

node* create()
{
node *newnode=new node;
return newnode;
}

void print(node* ptr)
{
int j=0;
while(ptr->data!=0)
{
for(j=0;j<=pow(2,j);j++)
{
cout<<ptr->data<<"\t";
if(j%2==0)
print(ptr->left);
else
print(ptr->right);
}
cout<<"\n";
}
}



int main()
{
int i=0,j=0,k=0,n=0,flag=0;
node* ptr;
for(i=1;flag!=1;i++)
{
if(i==1)
{
cout<<"Insert Root : ";
node *root=new node;
cin>>root->data;
ptr=root;
for(j=1;j<=pow(2,i);j++)
{
cout<<"Insert Level "<<i+1<<" : ";
cin>>n;
if(n==0)
{
flag=1;
break;
}
node *child=new node;
link(root,child,j);
}
}
else
{
node *root=new node;
for(j=1;j<=pow(2,i);j++)
{
cout<<"Insert Level "<<i+1<<" : ";
cin>>n;
if(n==0)
{
flag=1;
break;
}
node *child=new node;
link(root,child,j);
}
}
}
print(ptr);
getch();
return 0;

mohsen_7
15-05-2011, 17:39
کاش دقیقا توضیح میدادی که میخوای چیکار کنی. چیزی که خودم فهمیدم ظاهرا شما میخوای یک درخت دودویی کامل که هر سطحش تا آخر پر شده باشه رو تولید کنی. البته از کدی که نوشتی اینطور به نظر میرسه. برای اینکه اینکارو بکنی بهترین راهی که ذهنم رسید استفاده از یک صفه. شما که درختا رو خوندید صد در صد صفها رو هم باید خونده باشید. من سعی میکنم کدی که نوشتی رو با کمترین تغییر ممکن تبدیل به چیزی که میخوای بکنم. تا چند دقیقه دیگه واست آپ میکنم.

mohsen_7
15-05-2011, 18:43
برنامه برای پر کردن هر سطح از کاربر سوال میکنه اگه جواب مثبت باشه داده های اون سطح رو به درخت اضافه میکنه و در صورتی که جواب منفی باشه از حلقه خارج میشه و در آخر تمام داده های درخت به روش level_order یا همون پیمایش سطحی نمایش داده میشه. نکته ای که حتما میدونید اینه که با اضافه شدن هر سطح تعداد گره ها به نسبت سطح قبل دو برابر خواهند شد پس باید داده های بیشتری رو وارد درخت کنید. موفق باشید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

saeed_136915
15-05-2011, 20:22
بابا دستت درد نکنه. خیلی آقایی ممنون :11:

mohsen_7
15-05-2011, 23:53
خواهش میکنم سعید خان.
میشد برای کنترل خاتمه دریافت اطلاعات از همون فلگ استفاده کرد. منتها به نظرم این راه در این مسئله مناسبتر بود. یکی دو تا تابع هم اضافست که یادم رفت پاک کنم. مثل تابع link.
به هر حال امیدوارم که به دردت خورده باشه. موفق باشی :46: