相传此乃网易二面题
要求现场手写代码判断一个数字序列是BST后序遍历的结果。
如图所示 对于后续遍历的排序二叉树应具有上面的一个不等式性质 以及 根节点为最后一个节点的性质
因此代码如下
//序列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中的作者已经完成了算法,代码看起来比我的要规整多了,大家可以欣赏一下 传送门。