热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。

输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 10 11 8 6 7 5
输出样例2:
YES
11 8 10 7 5 6 8
输入样例3:
7
8 6 8 5 10 9 11
输出样例3:
NO

#include   
#include   
using namespace std;  
int a[1003], n, k = 0, b[1003];   
int check1(int l, int r)  
{  
    if(l > r)  
        return 1;  
    int root = a[l];//把根节点拿出来   
    int i, j;  
    for(i = l + 1 ; i <= r && a[i]  r)  
        return 1;  
    int root = a[l];  
    int i, j;  
    for(i = l + 1 ; i <= r && a[i] >= root; i++);  
    for(j = i ; j <= r ; j++)  
    {  
        if(a[j] >= root)  
            return 0;  
    }  
    if(check2(l + 1, i - 1) == 0)  
        return 0;  
    if(check2(i, r) == 0)  
        return 0;  
    b[k++] = a[l];  
    return 1;  
}  
int main()  
{  
    int i;  
    scanf("%d", &n);  
    for(i = 1 ; i <= n ; i++)  
        scanf("%d", &a[i]);  
    if(n == 1)  
    {  
        printf("YES\n%d\n", a[1]);  
        return 0;  
    }  
    if(a[1] > a[2])  
    {  
        if(check1(1, n))  
        {  
            printf("YES\n");  
            for(i = 0 ; i  
 

代码链接点击打开链接

题目链接点击打开链接

说实话此题的代码引起了我的深思,,

后面的代码可以将前序遍历变成中序遍历

#include   
#include   
using namespace std;  
int a[1003], n, k = 0, b[1003];   
int check1(int l, int r)  
{  
    if(l > r)  
        return 1;  
    int root = a[l];//把根节点拿出来   
    int i, j;  
    for(i = l + 1 ; i <= r && a[i]  r)  
        return 1;  
    int root = a[l];  
    int i, j;  
    for(i = l + 1 ; i <= r && a[i] >= root; i++);  
    for(j = i ; j <= r ; j++)  
    {  
        if(a[j] >= root)  
            return 0;  
    }  
    if(check2(l + 1, i - 1) == 0)  
        return 0;  
		 b[k++] = a[l]; /////////// (重要位置)递归的重要 
    if(check2(i, r) == 0)  
        return 0;  
   
    return 1;  
}  
int main()  
{  
    int i;  
    scanf("%d", &n);  
    for(i = 1 ; i <= n ; i++)  
        scanf("%d", &a[i]);  
    if(n == 1)  
    {  
        printf("YES\n%d\n", a[1]);  
        return 0;  
    }  
    if(a[1] > a[2])  
    {  
        if(check1(1, n))  
        {  
            printf("YES\n");  
            for(i = 0 ; i 代码链接 
 点击打开链接 

推荐阅读
  • 提升Win10启动效率的方法_有效加快Windows 10启动速度
    Windows 10以其卓越的性能和用户体验赢得了广大用户的喜爱,适用于多种工作与娱乐场景。然而,长时间使用后,不少用户反馈Win10系统的启动速度逐渐变慢。本文将详细介绍几种有效的方法来帮助您加速Win10的启动过程。 ... [详细]
  • Windows中实现清洁启动的步骤与技巧
    清洁启动是一种技术手段,旨在通过最小化启动项和驱动程序的数量来启动Windows系统,以此帮助用户识别并解决由软件冲突引起的系统问题。本文将详细介绍如何在Windows操作系统中执行清洁启动。 ... [详细]
  • 阿里飞猪旅行搜索技术的革新与实践
    本文由林睿(阿里飞猪)分享,经杜正海、Hoh编辑整理,并由DataFunTalk平台发布。文章探讨了旅行搜索技术从满足基本需求到集成高级功能的发展历程,特别是在阿里飞猪平台上的应用与创新。 ... [详细]
  • 本文通过C++代码示例,详细介绍了如何利用邻接矩阵构建无向图,并实现图的深度优先遍历(DFS)。文章包括了完整的代码实现,以及对关键函数的解释。 ... [详细]
  • 了解如何快速搭建属于自己的个人博客,无需编程基础,适合Mac和Windows用户。通过本文,您将学会使用GitHub Pages和Hexo构建一个完全自主的在线空间。 ... [详细]
  • 深入理解KMP算法及其应用
    本文详细介绍了KMP算法的原理和实现方法,包括如何计算next数组以及如何利用next数组进行高效的字符串匹配。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • Spring Boot + MyBatis Plus 实现SQL语句打印的两种方法
    本文详细介绍了如何在Spring Boot和MyBatis Plus环境中实现SQL语句打印的两种方法,包括配置文件设置和多数据源环境下的动态配置。适合开发者在日常开发和调试过程中参考。 ... [详细]
  • 题目链接:请点击这里。本题将图形视为波动,其中波峰被淹没时部分数减少,而波谷被淹没时部分数增加。因此,需要预先处理所有波峰和波谷的位置。特别地,图形的两端点需要特殊处理,可以通过设置边界条件来简化问题。 ... [详细]
  • 一款专为电脑维修店设计的U盘启动盘制作工具,支持多种操作系统安装与维护。 ... [详细]
  • 本文介绍了数据持久化的概念,重点讲解了MySQL数据库的基本操作,包括数据的查询、插入、更新及多表连接等,旨在帮助初学者快速掌握MySQL的核心功能。 ... [详细]
  • Docker入门与实践指南
    本文介绍了Docker的基础知识,包括其作为开源应用容器引擎的特点,以及如何利用Docker将应用程序及其依赖项打包成轻量级的容器镜像。同时,还详细讲解了Docker的核心概念、安装过程及基本命令操作。 ... [详细]
  • 本文探讨了如何使用已有的PHP网站来管理和控制Python编写的网络爬虫,包括启动、停止以及动态更改爬虫的目标网址。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • Java程序设计第五周学习总结与实践
    本次学习总结涵盖了本周在Java程序设计课程中的学习要点,包括代码阅读、抽象类的应用、接口的使用以及面向接口编程的概念。同时,还包括了具体的书面作业解析。 ... [详细]
author-avatar
UIUI张南南
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有