这道题首先需要建树,然后判断两个二叉搜索树是否相同,这里提供两种思路。
第 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; }
如果两个二叉搜索树的元素相同,那么它们的中序遍历序列必定相同。又因为由先序遍历和中序遍历序列可以唯一确定一颗二叉树,所以我们只需要判断两个二叉搜索树的先序遍历序列是否相同。
#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; }