二叉搜索树的后序遍历路径(《剑指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; }