سلام دوستان من میخوام یه درخت باینری رو از ورودی بگیرم و اون رو بصورت لیست پیوندی ذخیره کنم. ولی چون برای هر گره یا هر برگ درخت باید یه اسمی گذاشت نمیتونم کدش رو بنویسم. چیکار میتونم بکنم؟؟
Printable View
سلام دوستان من میخوام یه درخت باینری رو از ورودی بگیرم و اون رو بصورت لیست پیوندی ذخیره کنم. ولی چون برای هر گره یا هر برگ درخت باید یه اسمی گذاشت نمیتونم کدش رو بنویسم. چیکار میتونم بکنم؟؟
قسمت اول صحبتتون مشخصه و نوشتن برنامش هم زیاد کار خاصی نداره اما متوجه نامگذاری کردن برگها یا گره ها نشدم. یعنی میخواهید فیلدی به عنوان نام برای نگهداری نام هر برگ داشته باشید؟
سلام ممنون از جوابت :20:
کد برای ایجاد یه گره اینه :
من وقتی میخوام از ورودی مثلا 10 تا گره بگیرم باید به هرکدوم یه اسمی بدم که مشکلم اینجاسنقل قول:
struct node{
node *left;
int data;
node *right;
};
سلام دوست عزیز
نیازی به اسم دهی نیست. شما فقط کافیه آدرس ریشه رو بفرستی به تابعی که میخواهی این عمل رو انجام بده و بعدش همزمان با پیمایش درخت گره های لیست رو میسازی و محتویات هر گره رو داخل یک نود از لیست قرار میدی.
میشه کد اون قسمت ساخت گره های لیست رو بنویسین؟ :46:
با زبان سی یا سی پلاس پلاس؟
برای ساختن یک گره و مقدار دهی به فیلد داده ای در سی پلاس پلاس میتونید به شکل زیر عمل کنید. اگر بیشتر از این بخواهید دیگه باید کله برنامش رو براتون بنویسم.
[PHP]
struct ListNode {
int data;
ListNode * next;
}
ListNode * newListNode = new ListNode;
newListNode ->data = treeNode ->data;[/PHP]
---------- Post added at 12:41 PM ---------- Previous post was at 12:40 PM ----------
شما سعی کنید برنامش رو بنویسید بعد اگه مشکلی بود مطرح کنید تا حلش کنیم. موفق باشید
آقا دستت درد نکنه فکر کنم متوجه شدم ولی وقتی اینو مینویسم ایراد میگیره :
نقل قول:
cin>>treeNode->data;
خواهش میکنم.
دستوری که نوشتی ایرادی نداره. باید ببینیم چه خطایی میده. خطایی که اعلام میکنه رو بگو تا بررسی کنم.
این چرا نمیشه آخه :41::19:
از صبح نشستم پای کامپیوتر یه جاشو درست میکنی جای دیگه خراب میشه.
اگه ممکنه قسمتی که درخت رو میگیره و تو لیست پیوندی ذخیره میکنه رو واسم بزارین.
شما کاری که تا الان کردی رو اینجا بذار تا بهت بگم کجای کارت ایراد داره. چیز خاصی نیست مطمئن باش حل میشه.
اصلا سخت نگیر، برنامه نویسی همینه. من خودم شده چند روز واسه دو سه خط کد الکی دور خودم چرخیدم تا آخرش راه حل رو پیدا کردم. :41: :46:
سلام آقا اگه امکانش هست اینو ببینین اشکالش کجییه :31:
کد:http://www.jetup.ir/do.php?filename=14_05_1113053769951.cpp
نقل قول:
#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;
کاش دقیقا توضیح میدادی که میخوای چیکار کنی. چیزی که خودم فهمیدم ظاهرا شما میخوای یک درخت دودویی کامل که هر سطحش تا آخر پر شده باشه رو تولید کنی. البته از کدی که نوشتی اینطور به نظر میرسه. برای اینکه اینکارو بکنی بهترین راهی که ذهنم رسید استفاده از یک صفه. شما که درختا رو خوندید صد در صد صفها رو هم باید خونده باشید. من سعی میکنم کدی که نوشتی رو با کمترین تغییر ممکن تبدیل به چیزی که میخوای بکنم. تا چند دقیقه دیگه واست آپ میکنم.
برنامه برای پر کردن هر سطح از کاربر سوال میکنه اگه جواب مثبت باشه داده های اون سطح رو به درخت اضافه میکنه و در صورتی که جواب منفی باشه از حلقه خارج میشه و در آخر تمام داده های درخت به روش level_order یا همون پیمایش سطحی نمایش داده میشه. نکته ای که حتما میدونید اینه که با اضافه شدن هر سطح تعداد گره ها به نسبت سطح قبل دو برابر خواهند شد پس باید داده های بیشتری رو وارد درخت کنید. موفق باشید.
[PHP]
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
//#define NULL 0L
using namespace std;
#include <queue>
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;
}
void print(node* ptr)
{
queue <node*> levelOrderQueue;
if( !ptr ) return;
levelOrderQueue.push( ptr );
while(!levelOrderQueue.empty())
{
ptr = levelOrderQueue.front();
levelOrderQueue.pop();
if( ptr )
{
cout << ptr -> data << " ";
if(ptr ->left)
levelOrderQueue.push( ptr ->left );
if(ptr ->right)
levelOrderQueue.push( ptr ->right );
}
else
break;
}
}
bool continueAddData()
{
while(true)
{
cout << "create a level? (y/n):";
char c;
cin >> c;
switch (c)
{
case 'y':
return true;
case 'n':
return false;
default:
continue;
}
}
return false;
}
int main()
{
queue <node*> q;
node* root = NULL;
int treeLevel = 0;
if( continueAddData() )
{
cout << "Insert Root : ";
node *ptr = new node;
cin >> ptr -> data;
ptr -> left = NULL;
ptr -> right = NULL;
root = ptr;
q.push( root );
treeLevel++;
}
for( ; continueAddData() ; treeLevel++ )
{
queue<node*> tempQ;
while( !q.empty() )
{
node* ptr = q.front();
cout << "Insert Level " << treeLevel << " : ";
node *newNode = new node;
cin >> newNode -> data;
newNode -> left = NULL;
newNode -> right = NULL;
ptr ->left = newNode;
tempQ.push(newNode);
newNode = new node;
cin >> newNode -> data;
newNode -> left = NULL;
newNode -> right = NULL;
ptr ->right = newNode;
tempQ.push(newNode);
q.pop();
}
q = tempQ;
}
print( root );
getch();
return 0;
}
[/PHP]
بابا دستت درد نکنه. خیلی آقایی ممنون :11:
خواهش میکنم سعید خان.
میشد برای کنترل خاتمه دریافت اطلاعات از همون فلگ استفاده کرد. منتها به نظرم این راه در این مسئله مناسبتر بود. یکی دو تا تابع هم اضافست که یادم رفت پاک کنم. مثل تابع link.
به هر حال امیدوارم که به دردت خورده باشه. موفق باشی :46: