剑指——二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意俩个数字都互不相同

思路:后序遍历得到的序列中,最后一个数字是树的根节点的值,数组中前面的数字可以分为俩部分 第一部分是左子树节点的值,它们都比根节点的值小 第二部分是右子树节点的值,它们都比根节点大

#include <stdio.h>
#include <iostream>
using namespace std;

//判断此数组是不是某二叉树搜索树的后序遍历的结果
bool VerifySquenceOfBST(int sequence[],int length) //参数1是该数组 参数2是数组的大小
{
    if(sequence==NULL || length<=0)
        return false;
    int root=sequence[length-1];  //根据二叉搜索树后序遍历的性质,数组最后一个数为树的根
    //先找到数组中的左右子树分界点 因为搜索树中根的左子树都小于根,右子树都大于根
    int i=0;
    for(;i<length-1;++i)
    {
        if(sequence[i]>root)
            break; //发生break处的位置的i值就是第一个右子节点出现的位置
    }

    int j=i;
    for(;j<length-1;++j)  //判断数组对应的右子树中的节点是否都大于根节点
    {
        if(sequence[j]<root)
            return false;
    }

    //判断左子树是不是二叉搜索树
    bool left=true;
    if(i>0)
        left=VerifySquenceOfBST(sequence,i);

    //判断右子树是不是二叉搜索树
    bool right=true;
    if(i<length-1)
        right=VerifySquenceOfBST(sequence+i,length-i-1);

    return (left && right);
}

int main()
{
    int array[]={5,7,6,9,11,10,8};

    if(VerifySquenceOfBST(array,sizeof(array)/sizeof(array[0])))
        cout<<"It is an Binary search tree"<<endl;
    else
        cout<<"It is not an Binary search tree"<<endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/79962326
今日推荐