输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同.
我的代码:
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int nsize = sequence.size(); if(nsize == 0) return false; int root = sequence[nsize - 1]; int left = 0; int leftindex = 0; bool flag = true; for(int i = 0; i < nsize; i++) { if(sequence[i] > root) { left = sequence[i - 1]; leftindex = i - 1; flag = false; break; } } if(flag) return true; for(int i = leftindex+1;i < nsize;i++) { if(sequence[i] < root ) return false; } return true; } };
正确的代码:
解析:二叉搜索树,二叉排序树,二叉查找树,都是同一种东西:
1.它或者是一棵空树,
2.或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.它的左、右子树也分别为二叉排序树。
由于是后序遍历,vector的最后一位是当前树的跟,我们找到vector中第一个大于root的值就是右子树的第一个节点(这个节点前面的则是左子树的跟),判断从此节点一直到最后都要大于根,(右子树要大于根)。再递归的判断左右子树是否为二叉搜索树。
还要注意递归的调用条件。
1 class Solution { 2 public: 3 bool VerifySquenceOfBST(vector<int> sequence) { 4 return BST(sequence,0,sequence.size()-1); 5 } 6 bool BST(vector<int> sequence , int begin, int end) 7 { 8 if(sequence.empty()||begin>end) 9 return false; 10 int root = sequence[end]; 11 int i = begin; 12 for(;i<end;i++) 13 { 14 if(sequence[i] > root) 15 break; 16 } 17 for(int j = i; j < end; j++) 18 if(sequence[j] < root) 19 return false; 20 bool left = true; 21 bool right = true; 22 if(i>begin) 23 left = BST(sequence,0,i-1); 24 if(i<end-1) 25 right = BST(sequence,i,end-1); 26 return left&&right; 27 } 28 };