剑指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("Yes\n"); else printf("No\n"); } 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 ****************************************************************/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?