從二叉樹到查找二叉樹再到平衡二叉樹,人們老是爲了追求完美而不斷奮鬥,今天解決的問題是,當咱們讀入幾組長度同樣的數據,咱們如何判斷它們構建出來的樹是否同樣。遞歸
爲了解決這個問題,咱們能夠先用一組數據建立一顆樹,而後再將後面的幾組數據分別與建立好的這顆樹作比較。io
#include <stdio.h>
#include <stdlib.h>
typedef struct TNode {
int data;
struct TNode *left;
struct TNode *right;
int flag;//這個是用來判斷該結點的數據是否被訪問過。
}TNode,*Tree;
Tree NewNode (Tree T, int x);
int Judge(Tree T, int n);
Tree Insert (Tree T, int x);
int Check( Tree T, int x);
Tree CreateTree (Tree T, int n)//建立一棵n個結點的樹。
{
int x;
printf("x is :");
scanf("%d",&x);
T = NewNode(T,x);//先建立頭結點
int i;
for ( i = 1;i < n;i++) {//而後插入剩下的n-1個結點。
printf("x is :");
scanf("%d",&x);
T = Insert (T,x);
}
return T;
}
Tree NewNode (Tree T, int x)//爲T結點分配空間並賦值返回。
{
T = malloc(sizeof(TNode));
T->data = x;
T->flag = 0;
T->left = T->right = NULL;
return T;
}
Tree Insert (Tree T, int x)//插入x到T上。
{
if (!T) T = NewNode(T,x);
else if (x < T->data) {
T->left = Insert(T->left,x);
}else if (x > T->data ){
T->right = Insert (T->right,x);
}
return T;
}
int Judge (Tree T, int n)
{
int x;
printf("x is : ");
scanf("%d",&x);
int flag = 0;
if (x == T->data) T->flag = 1;
else flag = 1;
int i;
for(i = 1; i < n;i++){
printf("x is : ");
scanf("%d",&x);
if (!flag && !Check(T,x)) flag = 1;
}
if (flag == 1) return 0;
else return 1;
}
int Check (Tree T, int x)//判斷x是否在對應的位置。
{
if (T->flag) {
if (x > T->data) return Check(T->right,x);
else if (x < T->data) return Check (T->left,x);
else return 0;
}else {
if (x == T->data) {
T->flag = 1;
return 1;
}else {
return 0;
}
}
}
void Reset (Tree T)//清空flag的數據。
{
if (T->left) Reset (T->left);
if (T->right) Reset (T->right);
T->flag = 0;
}
void FreeTree (Tree T)//清空T的數據。
{
if (T->left) FreeTree(T->left);
if (T->right) FreeTree(T->right);
free(T);
}
int main ()
{
int N,L;
scanf("%d%d",&N,&L);//讀入長度爲L的n組數據
while (N) {
Tree T;
T = CreateTree (T,N);//先建立樹
int i;
for(i = 0;i < L;i++) {//分別判斷
if (Judge (T,N)) printf("YES\n");
else printf("NO!\n");
Reset(T);//判斷完一組數據後清空flag
}
FreeTree (T);//釋放該樹以便下一組長度爲L的n組數據的判斷。
scanf("%d%d",&N,&L);
}
return 0;
}二叉樹
對遞歸仍是有點朦朦朧朧,慢慢來吧,期待下一次。數據