shahinshyd
Member
با سلام
ما اینجا دو تا برنامه داریم که مربوط به مبحث ساختمان داده هست
1-برنامه ای که فرم پرانتزی یک درخت دودویی را به صورت رشته از ورودی خوانده وان را به فرم لیست پیوندی در حافظه پیاده سازی کرده و پیمایش های مختلف ان را چاپ میکند.
2-این برنامه تابعی است که زیردرخت های چپ و راست یک درخت را جابه جا میکند(تا اخرین سطح بصورت بازگشتی ).این تابع دربرنامه میاد خروجی را برای یک درخت فرضی(با چاپ پیمایش های درخت اولیه ودرخت حاصل)ازمایش میکند.
[/COLOR]اگه امکان داره از اساتید میخوام یک توضیحی در مورد سورس های این دو برنامه بدهند
ما اینجا دو تا برنامه داریم که مربوط به مبحث ساختمان داده هست
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-این برنامه تابعی است که زیردرخت های چپ و راست یک درخت را جابه جا میکند(تا اخرین سطح بصورت بازگشتی ).این تابع دربرنامه میاد خروجی را برای یک درخت فرضی(با چاپ پیمایش های درخت اولیه ودرخت حاصل)ازمایش میکند.
کد:
[COLOR=royalblue]
#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;
}
[/COLOR]اگه امکان داره از اساتید میخوام یک توضیحی در مورد سورس های این دو برنامه بدهند