,,输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回真,否则返回错误的。假设输入数组的任意两个数组都互不相同。
,,二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大,比如如上的二叉搜索树后序遍历的结果就是{5、7、6、9、11、10、8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断;
,,就拿上面的结果来说,可以发现,因为是后序遍历,因此数组的最后一个结点一定是根结点,而因为是二叉搜索树,所以根结点前面的部分可以分为两块,一块都比根结点的值要小,因此为其左结点,而另一部分都比根结点的值要大,因此是根结点的右子树部分,然后可以用递归来再对左右子树部分进行判断,如果不满足上述的任一部分则返回假.....
# include & lt; iostream> using namespace 性传播疾病; bool JudgeIsPostOrderOfBST (int * arr, size_t 开始,size_t 结束)//名字臭长臭长的,_ - { ,,,bool ret =,假; ,,,如果((arr !=, NULL),,,, (& lt; start 结束))//参数条件判断 ,,,{ ,,,,,,,size_t 小姐:=,0; ,,,,,,,,(,,小姐:& lt;,,, + + i)//在数组中查找第一个比根结点大的数,进行分块 ,,,,,,,{ ,,,,,,,,,,,如果(arr[我],祝辞,arr[结束]) ,,,,,,,,,,,,,,,休息; ,,,,,,,} ,,,,,,,size_t j =,我; ,,,,,,,,(;,j & lt;,,, + + j)//对分块之后的部分进行判断,如不满足直接返回错误的 ,,,,,,,{ ,,,,,,,,,,,如果(arr [j], & lt;, arr[结束]) ,,,,,,,,,,,,,,,return 回收; ,,,,,,,} ,,,,,,,如果(==j 结束)//如果满足条件则当前状态为真的,接着就需要进行递归判断左右子树部分 ,,,,,,,,,,,ret =,真的; ,,,,,,,如果(start & lt;,张) ,,,,,,,,,,,ret =, JudgeIsPostOrderOfBST(加勒比海盗,,,,张); ,,,,,,,如果(小姐:& lt;, end-1) ,,,,,,,,,,,ret =, JudgeIsPostOrderOfBST(加勒比海盗,,我,,end-1); ,,,} ,,,return 回收; } int main () { ,,,int arr1 [],=, {5、7、6、9、11、10、8}; ,,,int arr2 [],=, {4、5、2、6、7、3、1}; ,,,cout<& lt; JudgeIsPostOrderOfBST (arr1, 0, sizeof (arr1)/sizeof (arr1 [0] 1)) & lt; & lt; endl; ,,,cout<& lt; JudgeIsPostOrderOfBST (arr2, 0, sizeof (arr2)/sizeof (arr2 [0] 1)) & lt; & lt; endl; ,,,return 0; }
运行程序:
《完》