题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如,输入数组{5,7,6,9,11,10,8},则返回true,,因为这个整数是下图二叉搜索树的后序遍历结果,如果输入的数组是{7,4,6,5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返加false。
二叉搜索树是一种二叉树的树形数据结构,其定义如下:
-
空树是二叉搜索树。
-
若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。
-
若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。
-
二叉搜索树的左右子树均为二叉搜索树。
分析:后序遍历得到的序列,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。接下来可以递归确定与数组每一部分对应的子树的结构。
bool VerifySquenceOfTree(int sequence[],int length){if(sequence == nullptr || length <= 0)return false;int root = sequence[length - 1];//在二叉树搜索树中左子树节点的值小于根节点的值int i = 0;for(;i < length - 1;++i){if(sequence[i] > root)break;}//在二叉搜索树中右子树节点的值都大于根节点的值int j = i;for(;j < length - 1;++j){if(sequence[j] < root)return false; //如果右子树节点的值小于根节点的值则不满足}//判断左子树是不是二叉搜索树bool left = true;if(i > 0)left = VerifySquenceOfTree(sequence,i);//判断右子树是不是二叉搜索树bool right = true;if(i < length - 1)right = VerifySquenceOfTree(sequence + i,length - i - 1);return (left && right);
}