题解 | #二叉搜索树的后序遍历序列#

二叉搜索树的后序遍历序列

http://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd

二叉搜索树后序遍历序列 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;
}
全部评论

相关推荐

07-23 11:23
门头沟学院 Java
点赞 评论 收藏
分享
Lorn的意义:你这标个前端是想找全栈吗?而且项目确实没什么含金量,技术栈太少了,边沉淀边找吧 现在学院本想就业好一点四年至少得高三模式两年加油吧
点赞 评论 收藏
分享
zzzzhz:兄弟你先猛猛投简历至少三百家,能约到面试就去面。最近可以速成智能小车,智慧家居烂大街的项目,不需要自己写,只需要把里面的代码讲解看明白就行。把其中涉及到的八股文都拿出来单独背一下,我去年找工作就一个智能小车智慧家居找了10k差不多。
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务