实例4-1 是否同一棵二叉搜索树

求解思路:先建一棵树,再判别其他序列是否与该树一致。

/*
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1 
2 1
1 2
0
*/
#include<stdio.h>
#include<stdlib.h>

// 数据结构
typedef struct TreeNode *Tree;
struct TreeNode {
    int data;
    Tree left, right;
    int flag;
};

Tree NewNode(int data) {
    Tree T = (Tree)malloc(sizeof(struct TreeNode));
    T->data = data;
    T->left = T->right = NULL;
    T->flag = 0;
    return T;
}

Tree InsertNode(Tree T, int data) {
    if (!T) {
        T = NewNode(data);
    }
    else {
        if (data < T->data)
            T->left = InsertNode(T->left, data);
        else
            T->right = InsertNode(T->right, data);
    }
    return T;
}

Tree MakeTree(int N) {
    int i, data;
    scanf("%d", &data);
    Tree T = NewNode(data);
    for (i = 1; i < N; i++) {
        scanf("%d", &data);
        T = InsertNode(T, data);
    }
    return T;
}

int CheckNode(Tree T, int data) {
    if (T->flag) {
        if (data < T->data)
            return CheckNode(T->left, data);
        else if (data > T->data)
            return CheckNode(T->right, data);
        else
            return 0;
    }
    else {
        if (data == T->data) {
            T->flag = 1;
            return 1;
        }
        else
            return 0;
    }
}

int Judge(Tree T, int N) {
    int i, data;
    scanf("%d", &data);
    if (data == T->data) T->flag = 1;
    else return 0;
    for (i = 1; i < N; i++) {
        scanf("%d", &data);
        if (!CheckNode(T, data)) {
            return 0;
        }
    }
    return 1;
}

void ResertTFlag(Tree T) {
    if (T->left) ResertTFlag(T->left);
    if (T->right) ResertTFlag(T->right);
    T->flag = 0;
}

void FreeTree(Tree T) {
    if (T->left) FreeTree(T->left);
    if (T->right) FreeTree(T->right);
    free(T);
}

int main() {
    int N, L, i;
    Tree T;
    scanf("%d", &N);
    while (N) {
        scanf("%d", &L);
        // 根据第一行序列建树
        T = MakeTree(N);
        for (i = 0; i < L; i++) {
            if (Judge(T, N))    // 判定
                printf("YES!\n");
            else
                printf("NO!\n");
            ResertTFlag(T);
        }
        FreeTree(T);
        scanf("%d", &N);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/bingbeichen/article/details/76707225