题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
思路:根据二叉树的性质:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。在后序遍历得到的序列中,最后一个数字是树的根节点的值。整体采用递归的思想来判别。
核心代码如下:
bool VerifySequenceOfBST(int sequence[], int length){
if(sequence == nullptr || length <= 0)
return false;
int root = sequence[length - 1];
//在二叉搜索树中左子树节点的值小于根节点的值
int i = 0;
for(i; i < length - 1; i++){
if(sequence[i] > root)
break;
}
//在二叉搜索树中右子树节点的值大于根节点的值
int j = i;
for(j; j < length - 1; j++){
if(sequence[j] < root)
return false;
}
//判断左子树是不是二叉搜索树
bool left = true;
if(i > 0) //存在左子树
left = VerifySequenceOfBST(sequence, i);
//判断右子树是不是二叉搜索树
bool right = true;
if(i < length - 1) //存在右子树
right = VerifySequenceOfBST(sequence + i, length - i -1);
return (left && right);
}