<数据结构>XDOJ332.二叉排序树的判定
问题与解答
问题描述
给定一个二叉树,判断其是否是一个有效的二叉排序树。
假设一个二叉排序树具有如下特征:
结点的左子树只包含小于当前结点的树。
结点的右子树只包含大于当前结点的树。
所有左子树和右子树自身必须也是二叉排序树。
输入格式
第一行两个数n,root,分别表示二叉树有n个结点,第root个结点是二叉树的根。接下来共n行,第i行三个数val_i、left_i、right_i,分别表示第i个结点的值val是val_i,左儿子left是第left_i个结点,右儿子right是第right_i个结点。
节点0表示空。
1<=n<=100000,保证是合法的二叉树
输出格式
输出"true"如果给定二叉树是二叉排序树,否则输出"false"
样例输入
5 1
5 2 3
1 0 0
3 4 5
4 0 0
6 0 0
样例输出
false
#include<stdio.h>
#define MAXSIZE 1000001 //最大结点数
typedef struct { //结构体表示结点
int val; //结点值
int lchild; //结点左子树位置
int rchild; //结点右子树位置
}Node;
Node data[MAXSIZE]; //结构体数组表示树
int Judge( Node data); //递归方法,判断是否为二叉排序树
int main (void) {
int n, root, i, j, val_i, left_i, right_i, flag;
scanf ("%d %d", &n, &root); //输入结点数和根节点位置
for (i = 1; i <= n; i++) { //建立树
scanf ("%d %d %d", &val_i, &left_i, &right_i);
data[i].val = val_i;
data[i].lchild = left_i;
data[i].rchild = right_i;
}
flag = Judge (data[root]); //调用Judge函数
if (flag) {
printf ("true\n");
}
else {
printf ("false\n");
}
return 0;
}
int Judge(Node p) {
if (p.lchild == 0 && p.rchild == 0) return 1; //终止条件,到达叶子结点
//判断当前结点是否满足排序树条件
if (p.lchild != 0 && p.val <= data[p.lchild].val //存在左子树且结点值小于左子树的值
|| p.rchild != 0 && p.val >= data[p.rchild].val) //存在右子树且结点值大于右子树的值
return 0; //若不满足,返回0
else { //若满足:
if(p.lchild != 0) return Judge(data[p.lchild]); //递归判断左子树
if(p.rchild != 0) return Judge(data[p.rchild]); //递归判断右子树
}
}
题后反思
- 在判断当前结点与左右子树的关系时,需要先确定左右子树存在。即不能遗漏
p.lchild != 0
否则当前结点不存在左或右子树时,还会继续和data[0].val进行比较进而导致程序错误。 Judge(data[p.lchild])
前需要return
。
<数据结构>XDOJ332.二叉排序树的判定的更多相关文章
- D&F学数据结构系列——二叉排序树
二叉排序树(Binary Sort Tree) 定义:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值. 二叉查找树声明: #ifndef _ ...
- 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)
在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...
- 牛人的ACM经验 (转)
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈 ...
- ACM算法锦集
一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...
- 06: mysql索引查找原理及调优
MySQL其他篇 目录: 1.1 常见查找方法举例 1.2 索引数据结构设相关的计算机原理 1.3 MyISAM实现索引 1.4 InnoDB索引实现 1.5 索引使用策略 1.1 常见查找方法举例返 ...
- Mysql 索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...
- mySql---数据库索引原理及优化
一.写在前面 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型 ...
- 平衡二叉树(AVL)的理解和实现(Java)
AVL的定义 平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树.那么什么叫做高度平衡呢?意思就是要么它 ...
- (转)Mysql 索引原理及优化
本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...
随机推荐
- Spark基础:(六)Spark SQL
1.相关介绍 Datasets:一个 Dataset 是一个分布式的数据集合 Dataset 是在 Spark 1.6 中被添加的新接口, 它提供了 RDD 的优点(强类型化, 能够使用强大的 lam ...
- 【二分答案】CF1613 C. Poisoned Dagger
题目:Problem - C - Codeforces 本题的优解是二分答案,但我其实不会二分,本质是用了两个指针作为边界,然后不断对半缩小范围来快速确定答案. 神奇的二分法 代码: #include ...
- mysql外键策略
1.外键 建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作 create table dage( create table xi ...
- Linux:$i 和 ${i}区别
例如你要把有个变量的值和其他字符串连接起来,就需要用到{},以明示{}中的是一个变量. 例如: export var1=ABC export var2=var1=${var1} echo $var2 ...
- 大数据处理系列之(一)Java线程池使用
前言:最近在做分布式海量数据处理项目,使用到了java的线程池,所以搜集了一些资料对它的使用做了一下总结和探究, 前面介绍的东西大多都是从网上搜集整理而来.文中最核心的东西在于后面两节无界队列线程池和 ...
- NSURLConnection和Runloop
- 1.1 涉及知识点(1)两种为NSURLConnection设置代理方式的区别 //第一种设置方式: //通过该方法设置代理,会自动的发送请求 // [[NSURLConnection alloc ...
- 【编程思想】【设计模式】【行为模式Behavioral】registry
Python版 https://github.com/faif/python-patterns/blob/master/behavioral/registry.py #!/usr/bin/env py ...
- Servlet+Jdbc+mysql实现登陆功能
首先是新建一个servlet,servlet中有dopost和doget方法 一般的表格提交都是用post方法,故在dopost里面写入逻辑代码 下面是其逻辑代码Check.java protecte ...
- 【C/C++】学生排队吃饭问题
问题: 有n个学生,学生们都在排队取餐,第个学生在L国时刻来到队尾,同一时刻来的学生编号小的在前,每个时刻当队列不为空时,排在队头的同学就可以拿到今天的中餐并离开队伍,若第个学生R团时刻不能拿到中餐, ...
- .net core Winform 添加DI和读取配置、添加log
首先新建配置类 public class CaptureOption { /// <summary> /// 是否自启 /// </summary> public bool A ...