是否同一棵二叉搜索树
时间:2021-08-08
本文章向大家介绍是否同一棵二叉搜索树,主要包括是否同一棵二叉搜索树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。随后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
方法
代码实现(pta提交正确)
#include <stdio.h>
#include <malloc.h>
typedef struct node *tree;
tree lnsert(tree t,int v);
tree newgz(int v);
struct node{
int V;//该结点值的大小
tree left,right;
int flag;//在判断是否为同一个二叉搜索树的时候用来标记该节点是否被访问过
};
/*建搜索树*/
tree gz(int n){
tree t;
int i,v;
scanf("%d",&v);
t=newgz(v);//构造一个新的节点
for(i=1;i<n;i++){
scanf("%d",&v);
t=lnsert(t,v);//把后续的结点按二叉搜索树的特点插进t
}
return t;
}
/*构造一个结点*/
tree newgz(int v){
tree t=(tree)malloc(sizeof(struct node));
t->V=v;
t->left=t->right=NULL;
t->flag=0;
return t;
}
/*将一个结点插入二叉搜索树*/
tree lnsert(tree t,int v){
if(!t) t=newgz(v);
else{
if(v>t->V) t->right=lnsert(t->right,v);
else t->left=lnsert(t->left,v);
}
return t;
}
int dpd(tree t,int v){
if(t->flag){//如果该节点之前访问过了 ,则去左边或右边去找
if(v<t->V) return dpd(t->left,v);
else if(v>t->V) return dpd(t->right,v);
else return 0;//如果相等 ,有意味在这个序列里面,有一个数出现2次,不符合二叉搜索树的定义,
}
else{//如果该节点之前没被访问过并且就是我们要找的点,则符合,并将flag设为
if(v==t->V){
t->flag=1;
return 1;
}
else return 0; //如果该节点之前没被访问过而且又不是我们要找的 ,说明这个个结点是之前未出现的结点,则不是
}
}
int qpd(tree t,int n){
int i,v,flag=0;//0表示一致,1表示不一致
scanf("%d",&v);
if(v!=t->V) flag=1;//第一个为根结点的值,如果各阶段的值不同,则不会是同一棵二次手术
else t->flag=1;//根结点已经访问,flag设为1
for(i=1;i<n;i++){
scanf("%d",&v);
if((!flag)&&(!dpd(t,v))) flag=1;
}
if(flag) return 0;
return 1;
}
void resetf(tree t){
if(t->left) resetf(t->left);
if(t->right) resetf(t->right);
t->flag=0;
}
void freet(tree t){
if(t->left) freet(t->left);
if(t->right) freet(t->right);
free(t);
}
int main(){
int n,l,i;
tree t;
scanf("%d",&n);
while(n){//n为0,程序退出
scanf("%d",&l);
t=gz(n);//建树
for(i=0;i<l;i++){//输入l列,判断跟树是不是同一棵树
if(qpd(t,n)) printf("Yes\n");
else printf("No\n");
resetf(t);//清除t中的标记flag,使其都为0
}
freet(t);//把树释放掉
scanf("%d",&n);
}
}
原文地址:https://www.cnblogs.com/wjc6765/p/15115434.html
- python的with语句,超级强大
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- Linux下性能调试工具-top和sar运维笔记
- Apache+wsgi+flask部署
- “勒索病毒”到底会勒索啥,尽可以做到让全球对之恐惧无奈!
- 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)
- “AS3.0高级动画编程”学习:第二章转向行为(下)
- windows系统中eclipse C开发环境的架设
- 5个酷毙的Python工具
- ”盒模型“之如何防止边框和内边距把元素撑开
- excel中的不同类型图表叠加
- 这几天遇到的关于IE6/sql2008/win2003的奇怪bug
- 基于Web的工作流管理系统的设计与实现
- 这是对position讲解最通俗易懂的版本了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java进阶训练营 第一周JVM 预习笔记
- LeetCode905. 按奇偶排序数组 题解
- codeforces 1133D (map+精度控制)
- 只要十步,你就可以应用表达式树来优化动态调用
- 宏任务和微任务的一个小事
- 如何使用ES6的新特性async await进行异步处理
- java9-可以在interface中定义私有方法了
- 继承
- ES5新增方法
- django 重写user表 继承 AbstractUser 出现创建用户密码是明文
- Element表单嵌套数据验证
- 表格中的输入框验证
- 如何设置Element表格显示或者隐藏列
- Python 二进制,十进制,十六进制转换
- 原生node处理get和post请求