最笨的方法,即有先序序列和中序序列可以唯一的确定一棵二叉树,可以用来判断生成的树是否相同

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

//是否是同一颗二叉搜索树
typedef struct TreeNode{
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

//由前序序列和中序序列可以唯一确定一棵二叉树

//建树
TreeNode* createTree(TreeNode* root,int data){
    if(root == NULL){
        TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
        newNode->data = data;
        newNode->left = newNode->right = NULL;
        return newNode;
    }else if(root->data > data){
        root->left = createTree(root->left,data);
    }else if(root->data < data){
        root->right = createTree(root->right,data);
    }
    return root;
}

//访问结点
void visit(TreeNode* node){
    if(node == NULL){
        printf("NULL ");
    }else{
        printf("%d",node->data);
    }
}

//递归先序遍历
void preOrder(TreeNode* root, char *pre, int *index){
    if(root != NULL){
        pre[(*index)++] = root->data+'0';
        preOrder(root->left,pre,index);
        preOrder(root->right,pre,index);
    }
}

//递归中序遍历
void inOrder(TreeNode* root, char *in, int *index){
    if(root != NULL){
        in[(*index)++] = root->data +'0';
        inOrder(root->left,in,index);
        inOrder(root->right,in,index);
    }
}



int main(){
    int N,L;
    while(scanf("%d",&N) == 1 && N!=0){
        scanf("%d",&L);
        //建立初始树
        TreeNode* root = NULL;
        //初始树的两个序列
        int pre_index=0,in_index = 0;
        char *pre = (char*)malloc((N+1)*sizeof(char));
        char *in = (char*)malloc((N+1)*sizeof(char));
        for(int i = 0; i < N; i++){
            int data;
            scanf("%d",&data);
            root = createTree(root,data);
        }
        preOrder(root,pre,&pre_index);
        inOrder(root,in,&in_index);
        pre[pre_index] = '\0';
        in[in_index] = '\0';
        //检查
        for(int i = 0; i < L; i++){
            TreeNode* tempRoot = NULL;
            int temp_pre_index=0,temp_in_index = 0;
            char *temp_pre = (char*)malloc((N+1)*sizeof(char));
            char *temp_in = (char*)malloc((N+1)*sizeof(char));
            for(int j = 0; j < N; j++){
                int data;
                scanf("%d",&data);
                tempRoot = createTree(tempRoot,data);
            }
        preOrder(tempRoot,temp_pre,&temp_pre_index);
        inOrder(tempRoot,temp_in,&temp_in_index);
        temp_pre[temp_pre_index] = '\0';
        temp_in[temp_in_index] = '\0';
        if(strcmp(pre,temp_pre) == 0 && strcmp(in,temp_in) == 0){
            printf("Yes\n");
        }else{
            printf("No\n");
            }
        }

    }
    return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐