问题与解答

问题描述

给定一个二叉树,判断其是否是一个有效的二叉排序树。

假设一个二叉排序树具有如下特征:

结点的左子树只包含小于当前结点的树。

结点的右子树只包含大于当前结点的树。

所有左子树和右子树自身必须也是二叉排序树。

输入格式

第一行两个数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]); //递归判断右子树
}
}

题后反思

  1. 在判断当前结点与左右子树的关系时,需要先确定左右子树存在。即不能遗漏p.lchild != 0否则当前结点不存在左或右子树时,还会继续和data[0].val进行比较进而导致程序错误。
  2. Judge(data[p.lchild])前需要return

<数据结构>XDOJ332.二叉排序树的判定的更多相关文章

  1. D&F学数据结构系列——二叉排序树

    二叉排序树(Binary Sort Tree) 定义:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值. 二叉查找树声明: #ifndef _ ...

  2. 算法与数据结构(十) 二叉排序树的查找、插入与删除(Swift版)

    在上一篇博客中,我们主要介绍了四种查找的方法,包括顺序查找.折半查找.插入查找以及Fibonacci查找.上面这几种查找方式都是基于线性表的查找方式,今天博客中我们来介绍一下基于二叉树结构的查找,也就 ...

  3. 牛人的ACM经验 (转)

    一:知识点     数据结构:       1,单,双链表及循环链表       2,树的表示与存储,二叉树(概念,遍历)二叉树的                    应用(二叉排序树,判定树,博弈 ...

  4. ACM算法锦集

    一:知识点 数据结构: 1,单,双链表及循环链表 2,树的表示与存储,二叉树(概念,遍历)二叉树的 应用(二叉排序树,判定树,博弈树,解答树等) 3,文件操作(从文本文件中读入数据并输出到文本文 件中 ...

  5. 06: mysql索引查找原理及调优

    MySQL其他篇 目录: 1.1 常见查找方法举例 1.2 索引数据结构设相关的计算机原理 1.3 MyISAM实现索引 1.4 InnoDB索引实现 1.5 索引使用策略 1.1 常见查找方法举例返 ...

  6. Mysql 索引原理及优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

  7. mySql---数据库索引原理及优化

    一.写在前面 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型 ...

  8. 平衡二叉树(AVL)的理解和实现(Java)

    AVL的定义 平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树.那么什么叫做高度平衡呢?意思就是要么它 ...

  9. (转)Mysql 索引原理及优化

    本文内容主要来源于互联网上主流文章,只是按照个人理解稍作整合,后面附有参考链接. 一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引 ...

随机推荐

  1. Scala(六)【模式匹配】

    目录 一.基本语法 二.匹配固定值 三.守卫 四.匹配类型 五.匹配集合 1.Array 2.List 3.元祖 4.对象和样例类 六.偏函数 七.赋值匹配 八.for循环匹配 一.基本语法 在匹配某 ...

  2. oracle 预安装命令

     yum install oracle-rdbms-server-11gR2-preinstall-1.0-6.el6 

  3. Spring Cloud 和dubbo

    一.SpringCloud微服务技术简介 Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发.持续交付和容易部署等特点.Spring Cloud 的组 ...

  4. CentOs 7 yum 安装Nginx

    打开官网下载文档:http://nginx.org/en/download.html 2进入操作系统 centOs 7,建立文件夹 nginx ,进入nginx ,拷贝 上图1编辑命令:/etc/yu ...

  5. 【C/C++】最长无重复子数组

    题目描述 给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同. 子数组是连续的,比如[1,2,3,4,5]的子数组有[1,2],[2,3,4]等等,但是[1,3, ...

  6. 记ByteCTF中的Node题

    记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...

  7. Mac 下安装Phonegap开发环境

    Mac 下安装Phonegap开发环境 2014.09.11  星期四 评论 0 条    阅读 5,613 次 作者:野草 标签:phonegap ios mac 什么是Phonegap呢?Phon ...

  8. (转)Zookeeper原理和作用

    本周末学习zookeeper,原理和安装配置 本文参考: http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/ http:/ ...

  9. [BUUCTF]PWN6——ciscn_2019_c_1

    [BUUCTF]PWN6--ciscn_2019_c_1 题目网址:https://buuoj.cn/challenges#ciscn_2019_c_1 步骤: 例行检查,64位,开启了nx保护 nc ...

  10. matplotlib模块详解

    简单绘图,折线图,并保存为图片 import matplotlib.pyplot as plt x=[1,2,3,4,5] y=[10,5,15,10,20] plt.plot(x,y,'ro-',c ...