1 知识温习:
1.1 二叉搜索树具有以下性质
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
1.2 特点
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势。
不论哪一种操作,所花的时间都和树的高度成正比。因此,如果共有n个元素,那么平均每次操作需要O(logn)的时间。
解法1:在调用函数中,对子树的情况分别判断
class Solution {
public:
bool verify(vector<int>& postorder, int left, int right) {
if (left == right)
return true;
int i = left;
while (postorder[i] < postorder[right])
i++;
int j = i;
while (j < right) {
if (postorder[j] < postorder[right])
return false;
j++;
}
if (i == left) //左子树为空
return verify(postorder, left, right - 1);
int leftStart = left, leftEnd = --i;
int rightStart = leftEnd + 1, rightEnd = right - 1;
if (leftStart < leftEnd && rightStart < rightEnd) //左右子树均不为空
return verify(postorder, leftStart, leftEnd) && verify(postorder, rightStart, rightEnd);
return verify(postorder, leftStart, leftEnd);//右子树为空
}
bool verifyPostorder(vector<int>& postorder) {
int len = postorder.size();
if (len < 1) //空数也是true
return true;
return verify(postorder, 0, len - 1);
}
};
解法2:对解法1进行优化
class Solution {
public:
bool verify(vector<int>& postorder, int left, int right) {
if (left >= right) //空子树的判断,避免三种情况的分别判断
return true;
int i = left;
while (postorder[i] < postorder[right])
i++;
int j = i;
while (j < right) {
if (postorder[j] < postorder[right])
return false;
j++;
}
int leftStart = left, leftEnd = --i;
int rightStart = leftEnd + 1, rightEnd = right - 1;
return verify(postorder, leftStart, leftEnd) && verify(postorder, rightStart, rightEnd);
}
bool verifyPostorder(vector<int>& postorder) {
int len = postorder.size();
if (len < 1)
return true;
return verify(postorder, 0, len - 1);
}
};
仅仅是对调用函数verify的第一行修改了下,代码不仅简洁易懂,效率也有所提高。