题目详情:
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
主要思路:
(1)循环读入数据,并且在读到0时跳出循环可以写在while里
(2)插入二叉搜索树,用递归,因为插入的必是叶子节点,关键要有返回值,返回的是节点指针文章来源:https://www.toymoban.com/news/detail-572278.html
(3)先建立初始树,然后建立待比较树,用前序遍历比较两棵树是否相同文章来源地址https://www.toymoban.com/news/detail-572278.html
代码实现:
/*
首先要读入数据
建立原始树
建立插入树
比较原始树和插入树
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 15
/*用链表定义二叉搜索树的数据结构*/
typedef struct Tree Tree;
struct Tree {
int Data;
Tree* LeftChild;
Tree* RightChild;
};
/*插入二叉搜索树*/
Tree* InsertBST(Tree* root, int data) {
if(root == NULL) {
root = (Tree*)malloc(sizeof(Tree));
root->Data = data;
root->LeftChild = root->RightChild = NULL;
return root;
}
if(root->Data > data) {
root->LeftChild = InsertBST(root->LeftChild, data);
}
else if(root->Data < data) {
root->RightChild = InsertBST(root->RightChild, data);
}
return root;
}
/*前序遍历,判断两棵树是不是同一棵树*/
bool JudgeBST(Tree* root1, Tree* root2) {
if(root1 == NULL && root2 == NULL) {
return true;
}
if(root1 == NULL && root2 != NULL || root1 != NULL && root2 == NULL) {
return false;
}
if(root1->Data == root2->Data) {
bool leftSubtree = JudgeBST(root1->LeftChild, root2->LeftChild);
bool rightSubtree = JudgeBST(root1->RightChild, root2->RightChild);
if(leftSubtree && rightSubtree) {
return true;
}
else return false;
}
else return false;
}
/*删除树*/
void DeleteTree(Tree* root) {
if(root == NULL) {
free(root);
return;
}
DeleteTree(root->LeftChild);
DeleteTree(root->RightChild);
free(root);
return;
}
int main() {
int N, L;
while(scanf("%d", &N) && N != 0 && scanf("%d", &L)) {
Tree* initTree = NULL;
/*建立原始二叉搜索树*/
for(int i = 0; i < N; i++) {
int data;
scanf("%d", &data);
initTree = InsertBST(initTree, data);
}
/*检查序列*/
for(int i = 0; i < L; i++) {
Tree* checkTree = NULL;
for(int i = 0; i < N; i++) {
int data;
scanf("%d", &data);
checkTree = InsertBST(checkTree, data);
}
if(JudgeBST(initTree, checkTree)) {
printf("Yes\n");
}
else {
printf("No\n");
}
DeleteTree(checkTree);
}
DeleteTree(initTree);
}
return 0;
}
到了这里,关于浙大数据结构之04-树4 是否同一棵二叉搜索树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!