题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同
二叉搜索树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值
- 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
- 左、右子树也分别为二叉排序树
特点:左子树结点的值都小于根节点的值,右子树结点的值都大于根节点的值
思路
序列最后一个值是根结点,根据根结点将序列剩余部分划分为两个部分,左子树部分比根节点的值都小,右子树部分比根节点的值都大。
拓展
如果需要处理一棵二叉树的遍历序列,则可以先找到二叉树的根节点,再根据根节点把整棵树的遍历序列拆分成左子树对应的序列和右子树对应的序列,接下来递归处理这两棵子树。
#include <iostream> #include <vector> #include <cstring> using namespace std; class Solution { public: bool is_bst(vector<int> &v,int beg,int end); }; bool Solution::is_bst(vector<int> &v,int beg,int end) { if(v.empty()||beg>end) return false; int root=v[end]; //划分二叉搜索树的左子树,找到该序列中第一个大于根节点的结点 int i=beg; for(;i<end;++i) if(v[i]>root)// break; //判断二叉搜索树的右子树有没有小于根节点的结点 int j=i; for(;j<end;++j) if(v[j]<root)//如果右子树有小于根节点的值,则该序列不是二叉搜索树 return false; bool left=true; if(i>beg) left=is_bst(v,beg,i-1); bool right=true; if(i<end-1) right=is_bst(v,i,end-1); return left&&right; } int main() { vector<int> v{5,7,6,9,11,10,8}; Solution s; cout<<boolalpha<<s.is_bst(v,0,v.size()-1)<<endl; return 0; }