题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
}
}
思路:
先回顾了解一下二叉搜索树:
二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
列如:
我们写一下上面这个二叉搜索树的后续遍历(左右根):
2,5,3,8,7,6
根据后续遍历规则以及二叉搜索树的规则,我们可以知道:
- 最后一个元素是根节点;
- 比最后一个元素大的,是树的右子树的元素;比最后一个树小的,是树的左子树的元素;
综上,我们可以将树划分成 [2,5,3] [8,7] [6]
其中 [6]是根结点, [2,5,3] 是左子树的后续遍历, [8,7] 是右子树的后续遍历。
我们可以将划分出来的 左子树 和 右子树 再继续按照上述方法划分;
一直到将元素划分完,划分过程中,如果没有违反二叉搜索树的规则,就说明改后续遍历是某二叉搜索树的后续遍历。
实现:
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length == 0)
return false;
return check(sequence,0,sequence.length - 1);
}
private boolean check(int[] sequence, int first, int last){
if (last - first <= 1)
return true;
int rootVal = sequence[last];
int cutIndex = first;
while (cutIndex < last && sequence[cutIndex] <= rootVal)
cutIndex++;
for (int i = cutIndex; i < last; i ++)
if (sequence[i] < rootVal)
return false;
return check(sequence,first,cutIndex - 1) && check(sequence,cutIndex,last -1);
}
}
来源:CSDN
作者:猿兄
链接:https://blog.csdn.net/love_MyLY/article/details/103980920