第四章—判別兩顆樹是否相同

從二叉樹到查找二叉樹再到平衡二叉樹,人們老是爲了追求完美而不斷奮鬥,今天解決的問題是,當咱們讀入幾組長度同樣的數據,咱們如何判斷它們構建出來的樹是否同樣。遞歸

爲了解決這個問題,咱們能夠先用一組數據建立一顆樹,而後再將後面的幾組數據分別與建立好的這顆樹作比較。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;
}二叉樹

對遞歸仍是有點朦朦朧朧,慢慢來吧,期待下一次。數據

相關文章
相關標籤/搜索