题目就是文章标题:
这个题呢,就是考察大家对二叉查找树的性质是不是很熟悉。
二叉查找树的后序遍历呢,就是三个部分组成:
左子树-右子树-根节点
这个条件对任何节点都是成立的。
所以,我们看头结点,也就是最后一个数,我们可以发现,左子树节点全部集中在左边,而右子树的节点全部集中在右边,也就是说根据根节点的值可以把整个数组划分成两个部分,
左边部分必须是全部小于根节点;右边部分必须全部节点大于根节点。
所以我们先得到一个分界点,然后遍历check是否符合上述性质。
如果满足,我们对这两个子部分递归的调用判断就可以啦。
代码:
for (i=beg; i < end; i++)
{
if (a[i]>target)
break;
}
这一段是从开始的位置开始,一直找到第一个大于root的点,也就是这个点左边的都应该是左子树,而右边的都是右子树。
j = i;
for (; j < end; j++)
{
if (a[j] < target)
return false;
}
这一段呢,就是基于上面的假设,判断数组的右边是否满足右子树的要求。
bool left = true;
if (i>beg)
left=isPrintTree(a, beg, i-1);
bool right = true;
if (i<end-1)
right =isPrintTree(a, i, end-1);
return (left&&right);
这一段就是递归的判断啦。
***
全部:(两个函数的作用是一样的,我开始写的时候出bug。。调试用的)
bool isPrintTree(int* a, int beg, int end)
{
if (!a )
return false;
int j;//seperate point
int target = a[end];
//check between beg & end-1
int i = beg;
//int i = 0;
/while ((i <= end - 1)&&a[i]<target)
i++;/
//ver2:
/for (i = beg; i<end; i++)
{
if (a[i]>target)
break;
}/
//ver3:
for (i=beg; i < end; i++)
{
if (a[i]>target)
break;
}
//when breaks:a[i]>target
j = i;
/*while ((i <= end - 1) && a[i] > target)
i++;*/
/*if (i != end - 1)
return false;*/
//ver2:
for (; j < end; j++)
{
if (a[j] < target)
return false;
}
bool left = true;
if (i>beg)
left=isPrintTree(a, beg, i-1);
bool right = true;
if (i<end-1)
right =isPrintTree(a, i, end-1);
return (left&&right);
}
bool verifySquenceOfBST(int squence[], int length)
{
if (squence == NULL || length <= 0)
return false;
// root of a BST is at the end of post order traversal squence
int root = squence[length - 1];
// the nodes in left sub-tree are less than the root
int i = 0;
for (; i < length - 1; ++i)
{
if (squence[i] > root)
break;
}
// the nodes in the right sub-tree are greater than the root
int j = i;
for (; j < length - 1; ++j)
{
if (squence[j] < root)
return false;
}
// verify whether the left sub-tree is a BST
bool left = true;
if (i > 0)
left = verifySquenceOfBST(squence, i);
// verify whether the right sub-tree is a BST
bool right = true;
if (i < length - 1)
right = verifySquenceOfBST(squence + i, length - i - 1);
return (left && right);
}
文章参考[何海涛大神文章](http://zhedahht.blog.163.com/)