剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
时间:2022-04-22
本文章向大家介绍剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367),主要内容包括题目描述:、解题思路:、全部代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入:
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
输出:
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No
解题思路:
首先我们观察题目:二叉搜索树,后序遍历两个知识点。
二叉搜索树,用于搜索,因此内部节点没有重复的元素。另外,满足二叉树的性质,左子树都比自己小,右子树都比自己大。那么可想而知,如果按照后序遍历,先左后右最后自己的顺序来遍历树,数组的最后一个元素肯定是自己(父节点),然后剩余的部分分成两个部分,第一部分都比自己小(左子树部分),第二部分都比自己大(右子树部分),因此套用这个关系就可以循环检验出是否是二叉搜索树的后序遍历了。
int isPost(int i,int j){
if(i == j)
return 1;
else{
int k=j-1;
while(k>=i){
if(test[k] > test[j])
k--;
else
break;
}
int flag = k;
while(k>=i){
if(test[k] < test[j])
k--;
else
break;
}
if(k == i-1){
if(test[i]>test[j] || test[j-1]<test[j] ){
//printf("(%d-%d)n",i,j-1);
return isPost(i,j-1);
}else{
//printf("(%d-%d)(%d-%d)n",i,flag,flag+1,j-1);
return (isPost(i,flag))&&(isPost(flag+1,j-1));
}
}else{
return 0;
}
}
}
另外要注意的是,本题的二叉树并非满二叉树,因此可能出现下面的测试代码:
3
1 2 3
也就是说,这个树的父节点,只有左子树,没有右子树(右孩子),但是这个测试用例仍然是要通过的。因此需要外加一个判断,判断是否仅有单个孩子子树
if(test[i]>test[j] || test[j-1]<test[j] ){
//printf("(%d-%d)n",i,j-1);
return isPost(i,j-1);
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int test[10005]={0};
int isPost(int i,int j);
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%d",&test[i]);
if(isPost(0,n-1))
printf("Yesn");
else
printf("Non");
}
return 0;
}
int isPost(int i,int j){
if(i == j)
return 1;
else{
int k=j-1;
while(k>=i){
if(test[k] > test[j])
k--;
else
break;
}
int flag = k;
while(k>=i){
if(test[k] < test[j])
k--;
else
break;
}
if(k == i-1){
if(test[i]>test[j] || test[j-1]<test[j] ){
//printf("(%d-%d)n",i,j-1);
return isPost(i,j-1);
}else{
//printf("(%d-%d)(%d-%d)n",i,flag,flag+1,j-1);
return (isPost(i,flag))&&(isPost(flag+1,j-1));
}
}else{
return 0;
}
}
}
/**************************************************************
Problem: 1367
User: xhalo
Language: C
Result: Accepted
Time:10 ms
Memory:952 kb
****************************************************************/
- 塔秘 | 从Zero到Hero,一文掌握Python关键代码
- 微信小程序请求server时遇到的2个问题
- Android NDK层编译OpenCV代码开发详解
- 实时通信框架 Socket.IO
- Kafka 快速起步
- 老司机带你用python来爬取妹子图
- 爬虫必学知识之正则表达式下篇
- 爬虫必学知识之正则表达式上篇
- python爬虫常用库之requests详解
- python爬虫常用库之urllib详解
- 如何 build 出尽可能小的 docker image?
- 一步一步教你如何用python操作mysql
- 利用Python实现卷积神经网络的可视化
- SDP(13): Scala.Future - far from completion,绝不能用来做甩手掌柜
- 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 数组属性和方法
- 小技巧整理(一)
- 20个能够有效提高 Pandas数据分析效率的常用函数,附带解释和例子
- 4.深入k8s:持久卷PV、PVC及其源码分析
- 5.深入k8s:StatefulSet控制器及源码分析
- 简介机器学习中的特征工程
- 在机器学习回归问题中,你应该使用哪种评估指标?
- 6.深入k8s:守护进程DaemonSet及源码分析
- 无所不能的Embedding 1 - Word2vec模型详解&代码实现
- 【JS】676- 1.1w字 | 初中级前端 JavaScript 自测清单 - 2
- matplotlib基础绘图命令之imshow
- 聊聊dubbo-go的broadcastCluster
- 爬取博客园文章
- 配置Python开发环境
- 部署Python应用
- 重写ThreadPoolTaskExecutor