题目
分析
为二叉树结构添加一个flag
字段,表示搜索过程中是否走过,初始化为false
。
根据第一个输入样例建立二叉树,设置一个全局的Isflag
,根据后面的样例搜索。
- 如果在搜索二叉树里没有找到符合的结点,则一定不能构成同样的二叉树。
- 如果在搜索过程中经过
flag
为false
的结点,表示出错,不能构成同一棵搜索二叉树。 - 搜索到结点后,将
flag
字段置为true
,表示已走过这个结点。
AC代码
#include "bits/stdc++.h"
using namespace std;
typedef struct TreeNode
{
int data;
bool flag;
TreeNode* left;
TreeNode* right;
TreeNode(int d) {
data = d;
flag = false;
left = right = NULL;
}
}*tree;
void insertNode(tree& root, int x) {
if (root == NULL) {
root = new TreeNode(x);
}
else {
if (x > root->data)
insertNode(root->right, x);
else
insertNode(root->left, x);
}
}
//标记一个全局的判断位,只要有一个节点不正确,就输出false
bool isFlag = true;
//经过的结点都应该是之前已走过的
void findNode(tree root, int x) {
//如果节点为空,那肯定不是同一棵树
if (root == NULL) {
isFlag = false;
return;
}
//走到这个结点,标记已经走过
if (root->data == x) {
root->flag = true;
return ;
}
//走过的结点必须是已走过的
if (root->flag == false) {
isFlag = false;
return;
}
//递归查找
if(root->data < x) {
findNode(root->right, x);
}
else {
findNode(root->left, x);
}
}
//清楚二叉搜索树的Flag标记
void clearTree(tree root) {
if (root == NULL) return;
root->flag = false;//未走过
clearTree(root->left);
clearTree(root->right);
}
int main() {
int n, m, i, j, t;
while (cin >> n && n) {
tree head = NULL;
cin >> m;
for (i = 0; i < n; i++) {
cin >> t;
insertNode(head, t);
}
while (m--) {
for (i = 0; i < n; i++) {
cin >> t;
findNode(head, t);
}
if (isFlag)
cout << "Yes\n";
else
cout << "No\n";
isFlag = true;
clearTree(head);
}
}
return 0;
}