这道题首先需要建树,然后判断两个二叉搜索树是否相同,这里提供两种思路。
第 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;
}

京公网安备 11010502036488号