第四章—判别两颗树是否相同
从二叉树到查找二叉树再到平衡二叉树,人们总是为了追求完美而不断奋斗,今天解决的问题是,当我们读入几组长度一样的数据,我们如何判断它们构建出来的树是否一样。
为了解决这个问题,我们可以先用一组数据创建一颗树,然后再将后面的几组数据分别与创建好的这颗树做比较。
#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;
}
对递归还是有点朦朦胧胧,慢慢来吧,期待下一次。