BST的后序遍历序列

递归:

bool pp(const vector<int> vi, int start, int end)
{
	if (start >= end)return 1;
	int i = start;
	while (i <= end && vi[i] < vi[end])i++;
	for (int j = i;j <= end;j++)if (vi[j] < vi[end])return 0;
	return pp(vi, start, i - 1) && pp(vi, i, end - 1);
}
bool VerifySquenceOfBST(vector<int> sequence)
{
	if (sequence.empty())return 0;
	if (sequence.size() == 1)return 1;
	return pp(sequence, 0, sequence.size() - 1);
}

思路:后序遍历的最后一个元素一定是树根。除树根外,前面的元素可以分为两部分,左子树的值和右子树的值。左子树的值都小于根,右子树的值都大于根。如果在递归过程中发现右子树的值小于根,那么false。

非递归:

bool VerifySquenceOfBST(vector<int> sequence)
{
	if (sequence.empty())return 0;
	if (sequence.size() == 1)return 1;
	int i = 0, size = sequence.size() - 1;
	while (size > 0)
	{
		while (sequence[i] < sequence[size])i++;
		while (sequence[i] > sequence[size])i++;
		if (i < size)return 0;
		i = 0;
		size--;
	}
	return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值