题意描述:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如输入{5,7,6,9,11,10,8}返回true;输入{7,4,6,5}返回false
对应的后序遍历结果为5、7、6、9、11、10、8
解题思路:在后序遍历序列中,最后一个数字是树的根结点的值,前面的数字可分为两个部分:第一部分是左子树,值都比根值小;第二部分是右子树,值都比根大。按些规律,依次判断,如果数组处理完毕则是后序遍历序列,否则不为后序遍历序列
(Java版)
boolean VerifySequenceOfBST(int[] sequence, int start, int end) {
if(sequence == null || (end-start)<=0)
return true;
int root = sequence[end-1];
int i = start;
for(; i < end-1; i++)
if(sequence[i] > root)
break;
int j = i;
for(; j < end-1; j++)
if(sequence[j] < root)
return false;
//判断左、右子序列是不是满足二叉搜索树
boolean left = true;
if(i > start)
left = VerifySequenceOfBST(sequence, start, i);
boolean right = true;
if(i < end - 1)
right = VerifySequenceOfBST(sequence, i ,end-1-i);
return (left && right);
}
(C++版)
bool VerifySequenceOfBST(int sequence[], int length) {
if (sequence == NULL || 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 = VerifySequenceOfBST(sequence, i);
//判断右子树是不是二叉搜索树
bool right = true;
if (i < length - 1)
right = VerifySequenceOfBST(sequence + i, length - i - 1);
return (left && right);
}
(Golang版)
func isBinaryTreePostOrder(arr []int) bool {
if len(arr) == 0 || len(arr) == 1 {
return true
}
lastEle := arr[len(arr)-1]
posIdx := 0
for ; posIdx < len(arr); posIdx++ {
if arr[posIdx] > lastEle {
break
}
}
i := posIdx
for ; i < len(arr); i++ {
if arr[i] < lastEle {
return false
}
}
left := isBinaryTreePostOrder(arr[0:posIdx])
right := isBinaryTreePostOrder(arr[posIdx:len(arr)-1])
return left && right
}