题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
http://ac.jobdu.com/problem.php?cid=1039&pid=9
思路:这个问题思路很简单,但思路简单不意味着轻易能全对。对我做递归题有更深的了解吧,所以贴进来了。
递归题的一般想法:1)看清结构,想办法分出递归子问题来;
2)考虑递归到最后会出现哪些情况,如本题,要么左树为空、要么右树为空、要么都不为空、要么只剩一个元素等等情况,把这些情况if else一下,即分段讨论;
3)用笔画出图来,找出每种情况题中i和j的关系是怎样的(i和j即左右子树移动的指针);
4)递归求解,注意每层递归有几个递归子问题,就可以看成几叉树,画出来更容易理解。
代码:
#include <stdio.h> #include <iostream> using namespace std; int arr[10005]; int n; int isPost(int s, int e){ if(s==e) return 1; int i=s; int j=e-1; while(arr[e]>arr[i]) i++; while(arr[e]<arr[j]) j--; int left = 1; int right = 1; if(j+1!=i) return 0; else{ //left is empty if(i==e){ right = isPost(s,e-1); } //right is empty else if(i==s){ left = isPost(s,e-1); } else{ left = isPost(s,j); right = isPost(i,e-1); } } if(left && right) return 1; else return 0; } int main(){ int i; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){ scanf("%d",&arr[i]); } int ans = isPost(0,n-1); printf("%s\n",ans?"Yes":"No"); } return 0; }
浙公网安备 33010602011771号