剑指33 二叉搜索树的后序遍历

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

 

二叉搜索树左子树小于根节点,右子树大于根节点,而后序遍历结果中根节点一定是最后一个。所以从左侧开始搜索,找到第一个大于根节点的值,前面的就是左子树。然后再在理论上的右子树中搜索,如果有小于根节点的数就说明这不可能是二叉搜索树。如果没有就继续递归判断左右子树。

 1 class Solution {
 2 public:
 3     bool verifyPostorder(vector<int>& postorder) {
 4         if(postorder.empty())
 5             return true;
 6         return recursive_judge(postorder,0,postorder.size()-1);
 7     }
 8 
 9     bool recursive_judge(vector<int>& postorder, int start, int end){
10         if(end==start)
11             return true;
12         int leftpos=start;
13         while(postorder[leftpos]<postorder[end])
14             ++leftpos;
15         --leftpos;
16         cout<<start<<","<<end<<","<<leftpos<<endl;
17         for(int i=leftpos+2;i<end;++i)
18             if(postorder[i]<postorder[end])
19                 return false;
20         bool ret=true;
21         if(leftpos>=start)
22             ret&=recursive_judge(postorder,start, leftpos);
23         if(leftpos<end-1)
24             ret&=recursive_judge( postorder,leftpos+1, end-1 );
25         return ret;
26     }   
27 };

 

posted @ 2020-07-25 10:51  __rookie  阅读(113)  评论(0编辑  收藏  举报