第四章—判别两颗树是否相同

从二叉树到查找二叉树再到平衡二叉树,人们总是为了追求完美而不断奋斗,今天解决的问题是,当我们读入几组长度一样的数据,我们如何判断它们构建出来的树是否一样。

为了解决这个问题,我们可以先用一组数据创建一颗树,然后再将后面的几组数据分别与创建好的这颗树做比较。

#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;
}

对递归还是有点朦朦胧胧,慢慢来吧,期待下一次。

posted @ 2020-10-20 22:49  jianzhui  阅读(244)  评论(0编辑  收藏  举报