二叉搜索树的后序遍历路径(《剑指offer》面试题24)

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

  分析:在后序遍历得到的序列中,最后一个数字是根节点的值。数组中前面的数字可以分为两个部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。所以我们首先在数组中从开头处遍历确定右子树第一个节点的位置,这就表明从这个位置一直到最后一个位置(根节点的位置)之前都是右子树。然后我们从刚才找到的右子树的第一个位置,遍历数组中的右子树部分。如果找到一个值小于根节点的值。那就不满足二叉搜索树右子树的值都比根节点的值大这一特性。然后一定要依照这种规则继续检查左右子树,比如{5,3,6,9,11,10,8}。

     这道题目是分治法思想的应用。

bool VerifySquenceofBST(int a[], int len) {
    if (a == NULL || len <= 0)
        return false;

    if (len == 1) return true;

    int pos1 = a[len - 1];
    int pos1 = 0;
    while (a[pos1] < root_val)
        pos1++;

    int pos2 = pos1;
    for (; pos2 < len - 1; ++pos2) {
        if (a[pos2] < root_val)
            return false;
    }

    bool flag_left = true;
    if (pos1 > 0)
        flag_left = VerifySquenceofBST(a, pos1);

    bool flag_right = true;
    if (pos1 < len - 1)
        flag_right =VerifySquenceofBST(a + pos1, len - pos1 - 1);

    return flag_left && flag_right;
}

 

posted @ 2015-09-01 20:45  vincently  阅读(1386)  评论(1编辑  收藏  举报