剑指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 };