您的位置:首页 > 其它

二叉搜索树的后序遍历序列25

2016-06-13 21:32 323 查看
题目描述:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历的结果。如果是则返回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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: