判断一个数字序列是BST后序遍历的结果

相传此乃网易二面题

要求现场手写代码判断一个数字序列是BST后序遍历的结果。

来源1来源2


如图所示 对于后续遍历的排序二叉树应具有上面的一个不等式性质 以及 根节点为最后一个节点的性质

因此代码如下

//序列array有n个元素
//如果这n个元素是二叉排序树的后续遍历结果 返回true
//否则 返回false
bool isBST(int * array, size_t n)
{
	assert(array != NULL);
	if (n <= 1)
	{
		return true; // 有一个节点 或0个节点 符合树的性质
	}
	size_t i = 0;
	for (i = 0; i < n-1; ++i)
	{
		if (array[i] > array[n-1]) //array[n-1] 为数组最后一个元素 如果是后续遍历 应该是树的根节点。根节点应该大于左子树中的所有节点
		{
			break;
		}
	}
	if (i == n-1)
	{
		//全是左子树中的点
		return isBST(array, n-1); //判断左子树是否成立
	}
	size_t l_end = i;
	for (i; i < n-1; ++i)
	{
		if (array[i] < array[n-1])
		{
			break;		//右子树中的所有节点应该大于根节点
		}
	}
	if (i == n-1)
	{
		// 判断左右子树是否合法
		return isBST(array, l_end) && isBST(array+l_end, n - 1 - l_end);
	}
	return false;
}
测试

如下的二叉排序树


void test_isBST()
{
	int a[]={0};
	int *p;
	size_t n = sizeof(a)/sizeof(a[0]);
	p=a;
	n = sizeof(a)/sizeof(a[0]);
	assert(isBST(p,n) == true);
	assert(isBST(p,0) == true);
	int b[]={2,4,3,7,6,8,5};
	p=b;
	n = sizeof(b)/sizeof(b[0]);
	assert(isBST(p,n) == true);

	//int c[]={2,4,3,8,6,7,5};
	int c[]={8,6,7};
	p=c;
	n = sizeof(c)/sizeof(c[0]);
	assert(isBST(p,n) == false);

}

由于先看的来源1 并且完成了算法。整理参考文献时才发现,原来源2中的作者已经完成了算法,代码看起来比我的要规整多了,大家可以欣赏一下 传送门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值