这道题首先需要建树,然后判断两个二叉搜索树是否相同,这里提供两种思路。
第 1 种思路(通用的思路):
如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }
};

TreeNode* insert(TreeNode* root, int x) {
    if (root == NULL) {
        root = new TreeNode(x);
    } else if (x < root -> val) {
        root -> left = insert(root -> left, x);
    } else {
        root -> right = insert(root -> right, x);
    }
    return root;
}

bool isSameTree(TreeNode* p, TreeNode* q) {
    if (p == NULL && q == NULL) {
        return true;
    }
    if (p == NULL || q == NULL) {
        return false;
    }
    if (p -> val != q -> val) {
        return false;
    }
    return isSameTree(p -> left, q -> left) && isSameTree(p -> right, q -> right);
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        if (n == 0) {
            break;
        }
        
        string str0;
        cin >> str0;
        TreeNode* root0 = NULL;
        for (auto ch : str0) {
            int val = ch - '0';
            root0 = insert(root0, val);
        }
        
        for (int i = 0; i < n; i++) {
            string str1;
            cin >> str1;
            TreeNode* root1 = NULL;
            for (auto ch : str1) {
                int val = ch - '0';
                root1 = insert(root1, val);
            }
            
            if (isSameTree(root0, root1)) {
                printf("YES\n");
            } else {
                printf("NO\n");
            }
        }
    }
    return 0;
}

第 2 种思路:
如果两个二叉搜索树的元素相同,那么它们的中序遍历序列必定相同。又因为由先序遍历和中序遍历序列可以唯一确定一颗二叉树,所以我们只需要判断两个二叉搜索树的先序遍历序列是否相同。
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

string xulie0;
string xulie1;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }
};

TreeNode* insert(TreeNode* root, int x) {
    if (root == NULL) {
        root = new TreeNode(x);
    } else if (x < root -> val) {
        root -> left = insert(root -> left, x);
    } else {
        root -> right = insert(root -> right, x);
    }
    return root;
}

void preOrder(TreeNode* root, string& s) {
    if (root == NULL) {
        return;
    }
    s += to_string(root -> val);
    preOrder(root -> left, s);
    preOrder(root -> right, s);
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        if (n == 0) {
            break;
        }
        
        xulie0 = "";
        string str0;
        cin >> str0;
        TreeNode* root0 = NULL;
        for (auto ch : str0) {
            int val = ch - '0';
            root0 = insert(root0, val);
        }
        
        preOrder(root0, xulie0);
        
        for (int i = 0; i < n; i++) {
            xulie1 = "";
            string str1;
            cin >> str1;
            TreeNode* root1 = NULL;
            for (auto ch : str1) {
                int val = ch - '0';
                root1 = insert(root1, val);
            }
            
            preOrder(root1, xulie1);
            
            if (xulie0 == xulie1) {
                printf("YES\n");
            } else {
                printf("NO\n");
            }
        }
    }
    return 0;
}