1.问题描述
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如,输入数组{5,7,6,9,11,10,8}
,则返回true,数组{7,4,6,5}
,则返回false。
2.分析
- 什么是二叉搜素树?若左子树不为空,则左子树上节点的值都小于根节点值,若右子树不为空,则右子树上节点的值都打印根节点的值;
- 此题一看,就知道是二叉搜索树是一个递归定义,我们使用递归的方法;
例如:输入{5,7,6,9,11,10,8}
,其中8是根节点,那么{5,7,6}
都小于8,所以,是左子树;{11,10,8}
都大于8,,所以是右子树。
之后分别分析{5,7,6}
,{11,10,8}
,都是一样的。
使用递归,那么要有退出递归的条件,即:递归边界,边界应该是,一颗树只有一个节点,即:一颗树其实是一个叶子节点的时候,那么就停止,返回true。
相反,如何判断不是二叉搜索树?比如{7,4,6,5}
,应为7大于5,那么左子树为{}
,右子树为{7,4,6}
,但是右子树的4小于5,所以错误。这不是一颗二叉搜索树。
3.源代码:
// from [start,end)
bool VerifySquenceOfBSTCore(int sequence[],int start,int end)
{
//若end - start ==1,表示此二叉树是一个叶子节点
if(end - start == 1)
return true;
int rootValue = sequence[end - 1];
int leftIndex = 0;
while(leftIndex < end -1 && sequence[leftIndex] < rootValue ) ++leftIndex;
int rightIndex = leftIndex;
while(rightIndex<end -1 && sequence[rightIndex] > rootValue) ++rightIndex;
//如果右子树全部都大于根节点的值,则rightIndex应该是等于end - 1
if(rightIndex != end -1)
return false;
bool leftTrue = true;
if(leftIndex > 0)
leftTrue = VerifySquenceOfBSTCore(sequence,0,leftIndex);
bool rigthTrue = true;
if(leftIndex < end -1)
rigthTrue = VerifySquenceOfBSTCore(sequence,leftIndex,rightIndex);
return leftTrue&&rigthTrue;
}
bool VerifySquenceOfBST_1(int sequence[], int length)
{
if(sequence == nullptr || length <=0)
return false;
return VerifySquenceOfBSTCore(sequence,0,length);
}
4.结论
- 知道什么是二叉搜索树
- 二叉搜索树的后序遍历
- 涉及到树,很多时候使用递归方法可以方便解决问题