题目地址

https://pta.patest.cn/pta/test/15/exam/4/question/712

5-4 是否同一棵二叉搜索树   (25分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数NN (\le 10≤10)和LL,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出NN个以空格分隔的正整数,作为初始插入序列。最后LL行,每行给出NN个插入的元素,属于LL个需要检查的序列。

简单起见,我们保证每个插入序列都是1到NN的一个排列。当读到NN为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

鸣谢青岛大学周强老师补充测试数据!

/*时间	结果	得分	题目	编译器	用时(ms)	内存(MB)	用户
2017-06-28 19:34 答案正确 25 5-4 gcc 2 1
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 12/12 2 1
测试点2 答案正确 8/8 2 1
测试点3 答案正确 3/3 2 1
测试点4 答案正确 2/2 2 1
*/ //建两棵树树然后比较树的方法,建树过程中卡壳,小测试数据没发现问题,修改if逻辑后ac #include<stdio.h>
#include<stdlib.h>
#define __DEBUGPRINT //
typedef struct TreeNode *BSTTree;
typedef struct TreeNode{
int data;
BSTTree left;
BSTTree right;
int flag;
}; int Max(int a,int b)
{
return a>b ? a : b;
} BSTTree BST_Insert(int x,BSTTree T)
{
if(T==NULL)
{
T=malloc(sizeof(struct TreeNode));
T->data=x;
T->left=NULL;
T->right=NULL;
T->flag=0;
return T;
}
if(x < T->data)
{
T->left=BST_Insert(x,T->left);
}
if(x > T->data)
{
T->right=BST_Insert(x,T->right);
}
return T;
} void BST_CleanFlag(BSTTree T)
{
if (T!=NULL)
{
__DEBUGPRINT("+++Func Cleanflag T->data=%d\n",T->data);
T->flag=0;
}
if(T->left != NULL)
BST_CleanFlag(T->left);
if(T->right != NULL)
BST_CleanFlag(T->right);
return;
} void BST_Free(BSTTree T)
{
if(T!=NULL)
{
__DEBUGPRINT("+Func BST_Free T->data=%d\n",T->data);
BST_Free(T->left);
BST_Free(T->right);
free(T);
}
} void BST_Print(BSTTree T)
{
if(T!=NULL)
{
BST_Print(T->left);
printf(":%d ",T->data);
BST_Print(T->right);
}
}
int TreeCompare(BSTTree A,BSTTree B)
{
if(A==NULL && B== NULL)
{
__DEBUGPRINT("++compare node all null\nA=%d,B=%d",A,B);
return 0;
}
else if((A==NULL && B!=NULL)||(A!=NULL && B==NULL))
{
__DEBUGPRINT("++one is null,one not\n");
return 1;
}
else if(A->data !=B->data)
{
__DEBUGPRINT("++not same data\n");
return 1;
} else
{
__DEBUGPRINT("++begin to compare child\n");
return Max(TreeCompare(A->left,B->left),TreeCompare(A->right,B->right));
}
} int check(int x,BSTTree T)
{
if(T==NULL) {
__DEBUGPRINT("++check ,x=%d,find a NULL node return 1\n",x);
return 1;
} if(T->flag==0)
{
if(x==T->data)
{
T->flag=1;
__DEBUGPRINT("++check ,x=%d,set a flag to node return 0\n",x);
return 0;
}
else
{
__DEBUGPRINT("++check ,x=%d,T->data=%d,dismatch,return 1\n",x,T->data);
return 1;
}
}
else if(x < T->data)
{
return check(x,T->left) ;
}
else if(x > T->data)
{
return check(x,T->right);
}
else return 1;
} int func()
{ int i,j,N,L,temp,flag_all;
BSTTree A=NULL,B=NULL; scanf("%d",&N);
if(N==0)
return 0; scanf("%d",&L); for(i=0;i<N;i++)
{
scanf("%d",&temp);
A=BST_Insert(temp,A);
} //BST_Print(A);
//printf("\n");
for(j=0;j<L;j++)
{
flag_all=0;
for(i=0;i<N;i++)
{
scanf("%d",&temp);
B=BST_Insert(temp,B);
}
flag_all=TreeCompare(A,B);
//BST_Print(B);
//printf("\n");
BST_Free(B);
B=NULL;
if(flag_all>0)
printf("No\n");
else
printf("Yes\n"); } BST_Free(A);
return 1;
} int main()
{ while(func());
}

  

PTA 04-树4 是否同一棵二叉搜索树 (25分)的更多相关文章

  1. 7-4 是否同一棵二叉搜索树 (25分) JAVA

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到. 例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结 ...

  2. PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树 指针)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  3. PTA 是否二叉搜索树 (25分)

    PTA 是否二叉搜索树 (25分) 本题要求实现函数,判断给定二叉树是否二叉搜索树. 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typede ...

  4. PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

    L2-004 这是二叉搜索树吗? (25 分)   一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结 ...

  5. PTA 是否同一棵二叉搜索树(25 分)

    是否同一棵二叉搜索树(25 分) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始 ...

  6. PTA 7-1 是否完全二叉搜索树 (30分)

    PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...

  7. [LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树

    Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that a ...

  8. 04-树4 是否同一棵二叉搜索树(25 point(s)) 【Tree】

    04-树4 是否同一棵二叉搜索树(25 point(s)) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和 ...

  9. 图解算法——恢复一棵二叉搜索树(BST)

    题目来源 基础:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用常数空间的 ...

随机推荐

  1. Oozie的作用

    Oozie的作用: 1.统一调度hadoop系统中常见的mr任务启动. hdfs操作. shell调度. hive操作等 2.使得复杂的依赖关系.时间触发.事件触发使用xml语言进行表达,开发效率提高 ...

  2. Netty实现WebSocket

    package com.qmtt.server; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; ...

  3. python中一些函数应用

    items将一个字典以列表的形式返回,因为字典是无序的,所以返回的列表也是无序的. 例如:a = {"a":1,"b":2}    a.items  就是 a ...

  4. JavaScript中,有三种常用的绑定事件的方法

    要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的 ...

  5. Selenium2(WebDriver)开发环境搭建(java版)

    一.开发环境 1.JDK 2.Eclipse 3.Firefox 28.0 4.selenium-java-2.44.0.zip 解压后: 5.selenium-server-standalone-2 ...

  6. java中异常处理finally和return语句的执行顺序

    finally代码块的语句在return之前一定会得到执行 如果try块中有return语句,finally代码块没有return语句,那么try块中的return语句在返回之前会先将要返回的值保存, ...

  7. [Python學習筆記] 利用 Python在Excel 插入註解

    用Python 來處理excel 檔 用過了 openpyxl 還有 pyexcel目前覺得除了讀寫如果還要使用另外的功能 (像是讀取格子裡的公式)可以用 xlwings  他的首頁標題 " ...

  8. 分享一个开源的JavaScript统计图表库,40行代码实现专业统计图表

    提升程序员工作效率的工具/技巧推荐系列 推荐一个功能强大的文件搜索工具SearchMyFiles 介绍一个好用的免费流程图和UML绘制软件-Diagram Designer 介绍Windows任务管理 ...

  9. iOS开发内购全套图文教程

    2015年最全的内购图文教程,首先是填各种资料,最后是代码,废话不多说,直接上图 ======================第一部分协议=============== 第一步 第二步 第三步 第四步 ...

  10. mysql登录(linux)

    一.修改配置文件 查询路径 find / -name my.cnf 修改文件 vi my.cnf [mysqld]下面加上skip-grant-tables 二.登录数据库 重启mysql servi ...