<数据结构>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
1.Spark中的Python和Scala的Shell (1): Python的Spark Shell 也就是我们常说的PySpark Shell进入我们的Spark目录中然后输入 bin/pyspa ...
- Apache2配置文件解读
每次碰到都不知道具体的作用,所以来分析一下 配置文件结构 apache2在启动的时候自动读取/etc/apache2/apache2.conf文件的配置信息,不同的配置项按功能分布在不同的文件中,然后 ...
- Output of C++ Program | Set 1
Predict the output of below C++ programs. Question 1 1 // Assume that integers take 4 bytes. 2 #incl ...
- RHEL 6.5安装系统
转自如下链接: http://www.jb51.net/os/128752.html
- delete() and free() in C++
In C++, delete operator should only be used either for the pointers pointing to the memory allocated ...
- 【编程思想】【设计模式】【行为模式Behavioral】Specification
Python版 https://github.com/faif/python-patterns/blob/master/behavioral/specification.py #!/usr/bin/e ...
- Dubbo提供者的异步执行
从前面"对提供者的异步调用"例子可以看出,消费者对提供者实现了异步调用,消费者线程的执行过程不再发生阻塞,但提供者对IO耗时操作仍采用的是同步调用,即IO操作仍会阻塞Dubbo的提 ...
- Spring Cloud 和dubbo
一.SpringCloud微服务技术简介 Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发.持续交付和容易部署等特点.Spring Cloud 的组 ...
- 拷贝txt文本中的某行的数据到excel中
package com.hope.day01;import java.io.*;import java.util.ArrayList;public class HelloWorld { publ ...
- spring mvc访问html页面404报错解决
<servlet> <servlet-name>context</servlet-name> <servlet-class>org.springfram ...