题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
利用递归的思想,在序列sequence中首先找到左子树的根,用i表示,那么右子树的第一个数就是i+1。右子树中判断各数是否大于根(根就是序列sequence的最后一个),出现不大于根的情况就返回false。
Java
package nowcoder;
public class S23_VerifySquenceOfBST {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0)
return false;
if(sequence.length == 1)
return true;
return judge(sequence, 0, sequence.length-1);
}
public boolean judge(int []a, int start, int end){
if(start >= end)
return true;
int i = start;
while(a[i] < a[end]){
++i;
}
for(int j=i;j<end;j++){
if(a[j]< a[end])
return false;
}
return judge(a,start,i-1) && judge(a,i,end-1);
}
public static void main(String[] args){
S23_VerifySquenceOfBST s23 = new S23_VerifySquenceOfBST();
int[] sequence = {3, 5, 4, 7, 9, 8, 2};
System.out.println(s23.VerifySquenceOfBST(sequence));
}
}
Python
class VerifySquenceOfBST:
def verifySquenceOfBST(self, sequence):
if len(sequence) == 0:
return False
if len(sequence) == 1:
return True
root = sequence[-1]
i = 0
#左子树个数i
for node in sequence[:-1]:
if node > root:
break
i += 1
for node in sequence[i+1:-1]:
if node < root:
return False
return self.verifySquenceOfBST(sequence[:i]) or self.verifySquenceOfBST(sequence[i+1:-1])
if __name__ == '__main__':
test = VerifySquenceOfBST()
sequence = [3, 5, 4, 7, 9, 8, 6]
print(test.verifySquenceOfBST(sequence))