04-树4 是否同一棵二叉搜索树
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-树4 是否同一棵二叉搜索树相关的知识,希望对你有一定的参考价值。
题目
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
基本思路
先根据第一行的输入建一棵二叉搜索树,每个结点设一个flag表示该结点是否被访问过。判断之后的输入时,对每个元素进行查找,入找到前碰到未访问过的元素或者找不到,说明不是同一棵二叉搜索树。
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Node* link;
struct Node
{
int val;
link left;
link right;
int flag; //访问过为1,否则为0
};
link insert(link T, int val);
int check(link T, int val);
void freeTree(link T);
void resetFlag(link T);
int main()
{
while (1)
{
int N, L,same=1;
scanf("%d", &N); //插入元素个数
if (N == 0)
break;
scanf("%d", &L); //检查序列个数
//根据第一行建树
link headpos=NULL;
int temp;
scanf("%d", &temp);
headpos = insert(headpos, temp);
for (int i = 1; i < N; i++)
{
scanf("%d", &temp);
insert(headpos, temp);
}
//判断是否是同一棵二叉树
for (int j = 0; j < L; j++)
{
resetFlag(headpos);
same = 1;
for (int i = 0; i < N; i++)
{
scanf("%d", &temp);
if (same != 0)
same = check(headpos, temp);
}
if (same == 1)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
same = 1;
freeTree(headpos);
}
return 0;
}
link insert(link T, int val)
{
if (T == NULL) //如果该结点为空则创立新结点,结束递归
{
T = new Node;
T->val = val;
T->flag = 0;
T->left = NULL;
T->right = NULL;
return T;
}
if (val > T->val)
{
T->right = insert(T->right, val);
}
else
{
T->left = insert(T->left, val);
}
return T;
}
int check(link T, int val)
{
if (!T) //到达叶结点下一层
return 0;
if(T->flag)
{
if (val > T->val)
check(T->right, val);
else if (val < T->val)
check(T->left, val);
else
return 0;
}
else
{
if (val == T->val)
{
T->flag = 1;
return 1;
}
else
return 0;
}
}
void freeTree(link T)
{
if (T->right)
freeTree(T->right);
if(T->left)
freeTree(T->left);
delete T;
}
void resetFlag(link T)
{
if (T->right)
resetFlag(T->right);
if (T->left)
resetFlag(T->left);
T->flag = 0;
}
总结
以上是关于04-树4 是否同一棵二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章