zoukankan      html  css  js  c++  java
  • 第四章—判别两颗树是否相同

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

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

    #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 ");
                else printf("NO! ");
                Reset(T);//判断完一组数据后清空flag
            }
            FreeTree (T);//释放该树以便下一组长度为L的n组数据的判断。
            scanf("%d%d",&N,&L);
         }

        return 0;
    }

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

  • 相关阅读:
    ubuntu安装软件失败
    阶乘函数 注意事项
    汇编退出
    vim比较文件
    汇编调试
    Redis
    记录一次ajax使用
    oracle11g导出dmp文件时不能导出空表,导致缺表
    将小数点后的0去掉
    redis
  • 原文地址:https://www.cnblogs.com/ranyang/p/13849661.html
Copyright © 2011-2022 走看看