PDA

View Full Version : مبتدی: درخواست بررسی سورس این دو برنامه مربوط به ساختار درختی



shahinshyd
جمعه 09 اردیبهشت 1390, 13:18 عصر
با سلام
ما اینجا دو تا برنامه داریم که مربوط به مبحث ساختمان داده هست


69296


اگه امکان داره از اساتید میخوام یک توضیحی در مورد سورس های این دو برنامه بدهند


1-برنامه ای که فرم پرانتزی یک درخت دودویی را به صورت رشته از ورودی خوانده وان را به فرم لیست پیوندی در حافظه پیاده سازی کرده و پیمایش های مختلف ان را چاپ میکند.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
int inorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
else
x=x&(node1->value==node2->value);
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
int postorder(Node*node1,Node*node2){
int x=1;
if(node1->left&&node2->left)
x=x&&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
x=x&&(node1->value==node2->value);
return x;
}
int preorder(Node*node1,Node*node2){
int x=1;
x=x&(node1->value==node2->value);
if(node1->left&&node2->left)
x=x&inorder(node1->left,node2->left);
else
if(node1->left != node2->left)
x=0;
if(node1->right&&node2->right)
x=x&inorder(node1->right,node2->right);
else
if(node1->right != node2->right)
x=0;
return x;
}
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}

int main(){
clrscr();
int n,x;
Node*root1=NULL,*root2=NULL;
printf("First tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root1){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root1=temp;
}else
Insert(n,x,root1);
}
printf("\nSecond tree elements ... \n");
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root2){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root2=temp;
}else
Insert(n,x,root2);
}

int issame=inorder(root1,root2)&&postorder(root1,root2)&&preorder(root1,root2);
if(issame)
printf("Binary trees are same");
else
printf("Binary trees are not same");
return 0;
}


2-این برنامه تابعی است که زیردرخت های چپ و راست یک درخت را جابه جا میکند(تا اخرین سطح بصورت بازگشتی ).این تابع دربرنامه میاد خروجی را برای یک درخت فرضی(با چاپ پیمایش های درخت اولیه ودرخت حاصل)ازمایش میکند.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Node{
int value;
Node*left;
Node*right;
};
void Insert(int n,int x,Node*root){
Node*temp=root;
int right=0;
for(int h=1;h!=n && temp;){
for(int j=n;j/2>h;j/=2);
if(j==h*2){
if(temp->left)
temp=temp->left;
right=0;
}
if(j==h*2+1){
if(temp->right)
temp=temp->right;
right=1;
}
h=j;
}
Node*t=(Node*)malloc(sizeof(Node));
t->value=x;
t->left=NULL;
t->right=NULL;
if(right)
temp->right=t;
else
temp->left=t;
}
void inorder(Node*node){
if(node->left)
inorder(node->left);
printf("%d,",node->value);
if(node->right)
inorder(node->right);
}
void postorder(Node*node){
if(node->left)
postorder(node->left);
if(node->right)
postorder(node->right);
printf("%d,",node->value);
}
void preorder(Node*node){
printf("%d,",node->value);
if(node->left)
preorder(node->left);
if(node->right)
preorder(node->right);
}
Node*Reverse(Node*root){
Node*temp=root;
if(temp){
Node*t=temp->left;
temp->left=Reverse(temp->right);
temp->right=Reverse(t);
}
return temp;
}
int main(){
clrscr();
int n,x;
Node*root=NULL;
for(;;){
printf("Please Enter a Number for element Place : ");
scanf("%d",&n);
if(n==0)
break;
printf("Please Enter a Number : ");
scanf("%d",&x);
if(!root){
Node*temp=(Node*)malloc(sizeof(Node));
temp->value=x;
temp->left=NULL;
temp->right=NULL;
root=temp;
}else
Insert(n,x,root);
}
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
root=Reverse(root);
printf("\b \ninlorder (LVR) : ");
inorder(root);
printf("\b \npostlorder (LRV) : ");
postorder(root);
printf("\b \nprelorder (VLR) : ");
preorder(root);
printf("\b \b");
return 0;
}

مسعود اقدسی فام
جمعه 09 اردیبهشت 1390, 13:48 عصر
توضیح خط به خط که منظورتون نیست؟!
کدوم قسمت رو متوجه نشدید؟

مسعود اقدسی فام
جمعه 09 اردیبهشت 1390, 13:55 عصر
در ضمن برنامه اول توضیحی که در موردش دادید درست نیست. اون برنامه کار دیگه‌ای انجام می‌ده.

shahinshyd
جمعه 09 اردیبهشت 1390, 16:25 عصر
توضیح خط به خط که منظورتون نیست؟!


اگه امکانش هست فقط یک توضیخ در مورد قسمت هاش بدید چون تعداد خط هاش هم زیاده ولی فکر کنم مثلا 20 خط اول یک کار انجام میده و...
راستی برنامه اول چیکار مبکنه؟
من که از صحبت های استاد چیزی نفهمیدم

مسعود اقدسی فام
شنبه 17 اردیبهشت 1390, 13:33 عصر
اگه امکانش هست فقط یک توضیخ در مورد قسمت هاش بدید چون تعداد خط هاش هم زیاده ولی فکر کنم مثلا 20 خط اول یک کار انجام میده و...
راستی برنامه اول چیکار مبکنه؟
من که از صحبت های استاد چیزی نفهمیدم

برنامه اول سه پیمایش مختلف دو درخت رو با هم مقایسه می‌کنه، و اگه هر سه یکی بودن نتیجه می‌گیره دو درخت مثل هم هستن.