题目描述:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
解题思路:
- 后序遍历顺序:LRV(左、右、根结点)
- 后序遍历结果的最后一个数字是根节点。
- 根据第2节点及二叉搜索树的规律,可以判定比最后一个数小的在左子树,否则在右子树。
- 如果第3条不成立,那么输入数组就不是二叉搜索树的后序遍历。
测试用例:
int main(){
//后序遍历数组
int succArr[7] = {5, 7, 6, 9, 11, 10, 8};
//只有一个节点的二叉树
int succArr2[1] = {1};
//没有对应一颗二叉搜索树
int succArr3[7] = {7, 5, 11, 10, 6, 8, 9};
//检查并返回结果
std::cout << "Is a post order traversal: " << VerifyOfPostOrder(succArr3, 7) << std::endl; //Output: 0,不是后序遍历序列
return 0;
}
函数实现:
bool VerifyOfPostOrder(int *sequence, int length){
if(sequence == NULL || length <= 0)
return false;
//先取出根节点的值
int root = sequence[length-1];
//在二叉搜索树中左子树的节点小于根节点
int i = 0;
for(; i < length-1; ++i)
if(sequence[i] > root)
break;
//在二叉搜索树种右子树的节点大于根节点
int j = i;
for(; j < length-1; ++j)
if(sequence[j] < root)
return false;
//判断左子树是不是二叉搜索树
bool Left = true;
if(i > 0)
Left = VerifyOfPostOrder(sequence, i);
//判断右子树是不是二叉搜索树
bool Right = true;
if(j < length - 1)
Right = VerifyOfPostOrder(sequence + i, length - i -1);
return (Left && Right);
}