肉饼铺子 2018-04-21
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路挺清晰的,但是不知道为什么,提交了好几次都只能通过部分用例,最后修修改改才通过的。总感觉我的这个做法不太好。
首先,后序遍历的最后一个元素是树的根节点root,然后可以将整个序列分成两个部分,分别是root的左子树和右子树,左子树的所有元素都比root小,右子树的所有元素都比root大。按照这个思路,就可以用左右子树分别递归,最后判断是否满足条件了。
代码如下:
public boolean VerifySquenceOfBST(int [] sequence) { int leftRoot = 0, rightRoot = sequence.length-1; if (sequence.length == 0) return false; if (sequence.length <= 3) return true; //只有一个后序序列,当只有三个节点的时候只能返回true for (int i=0; i<sequence.length; i++) { //找到第一个比root大的元素的位置,确定左子树的范围 if (sequence[i] >= sequence[sequence.length-1]) { leftRoot = i; break; } } for (int i=leftRoot+1; i<sequence.length; i++) { //判断右子树的所有元素是否比root大 if (sequence[i] < sequence[sequence.length-1]) return false; } if (leftRoot >= rightRoot) return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, leftRoot)); if (leftRoot == 0) return VerifySquenceOfBST(Arrays.copyOfRange(sequence, leftRoot, rightRoot)); return VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, leftRoot)) && VerifySquenceOfBST(Arrays.copyOfRange(sequence, leftRoot, rightRoot)); }
先序输出:<br />A B D G H E C K F I J<br />中序输出:(左中右)<br />G D H B E A K C I J F<br />后序输出:(左右中)可找出根节点<br