Nowcoder java-二叉搜索树的后序遍历序列
(题目来自牛客网)
思路
采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。 由题意可得: 1. 后序遍历序列的最后一个元素为二叉树的根节点; 2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。 算法步骤如下: 1. 找到根结点; 2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树; 3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点: a.若出现小于根结点的元素,则直接返回false; b.若右侧全都大于根结点,则分别递归判断左/右子序列是否为后序序列;
代码
public class VerifySquenceOfBST {
public boolean verifySquenceOfBST(int[] sequence) {
//采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
//
//由题意可得:
//1. 后序遍历序列的最后一个元素为二叉树的根节点;
//2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
//
//算法步骤如下:
//1. 找到根结点;
//2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
//3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
//4. 分别递归判断左/右子序列是否为后序序列;
if (sequence.length <= 0 || sequence == null) {
return false;
}
return verifySquenceOfBST1(sequence, 0, sequence.length - 1);
}
public boolean verifySquenceOfBST1(int[] sequence, int start, int end) {
if (start >= end) {//若遍历完了还没报错就证明是该二叉搜索树的后序遍历,否则返回false
return true;
}
int root = sequence[end];//找根节点
int i = start;
while (sequence[i] <= root && i < end) {//找根节点右子树的第一个节点,左侧为左子树,右侧为右子树
i++;
}
int j = i;
while (j < end) {//判断右子树中有没有比根节点小的值
if (sequence[j] < root) {
return false;
}
j++;
}
boolean left = verifySquenceOfBST1(sequence, start, i - 1);//递归左子树
boolean right = verifySquenceOfBST1(sequence, i, end - 1);//递归右子树
return left && right;
}
public static void main(String[] args) {
int[] sequence = {7,4,6,5};
System.out.println(new VerifySquenceOfBST().verifySquenceOfBST(sequence));
}
}