二叉搜索树后序遍历序列 C语言解题思路
思路:例如数组:[1,2,7,4,6,5,3] 搜索树,意思是任意节点,左孩子均小于节点值,右孩子均大于节点值
根据后序遍历,即后根遍历,很容易确定数组最后一个为根节点。此时根据根节点将数组分为左子树,右子树两部分,需要保证左右子树均为二叉搜索树。典型的递归思想,先根据数组末位将数组分为两部分,再分别对两部分执行判断即可。
注意:根据题目要求,空数组也不是二叉搜索树,因此设置一个全局变量,判断递归函数中初始数组是否为空。
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param sequence int整型一维数组
* @param sequenceLen int sequence数组长度
* @return bool布尔型
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
static int flag=0;
bool VerifySquenceOfBST(int* sequence, int sequenceLen ) {
//判断初始数组是否为空
if(flag==0&&sequenceLen==0)
return false;
flag=1;
//初始数组不为空,flag置为1,当数组元素个数为0或者1,肯定为一个搜索树,返回true
if(sequenceLen==1||sequenceLen==0)
return true;
int i=0,k=0;
//寻找第一个大于根节点的位置,也就是左右子树的分割位置
//经过左边元素会均小于根节点
while(sequence[i]<sequence[sequenceLen-1])
i++;
//记录这个位置
k=i;
//判断右边节点是否都大于根节点,如果都大于,i最后会指向根节点
while(sequence[i]>sequence[sequenceLen-1])
i++;
//说明提前出现了小于根节点的值
if(i<sequenceLen-1)
return false;
//递归判断左右子树是否为二叉搜索树
if(VerifySquenceOfBST(sequence, k) && VerifySquenceOfBST(&sequence[k], sequenceLen-k-1))
return true;
return false;
}