目录
题目描述
输入整数数组,判断该数组是不是某个二叉搜索树的后序遍历结果。是,返回true;不是,false。
假设输入的数组任意两个数字互不相同。
测试用例
- 功能测试(输入的后序遍历序列对应一颗二叉树,包括完全二叉树、所有节点都没有左/右子树的二叉树、只有一个节点的二叉树;输入的后序遍历没有对应的一颗二叉树)
- 特殊输入测试(指向后序遍历序列的指针为空指针)
解题思路
1、后序遍历基本结构为:左(比根小)------右(比根大)-------根;
2、在后序遍历序列中,检查数组中每一个子树是否满足1中的结构,这是一个递归过程;
3、所有都满足返回true,有一个不满足返回false。
参考解题
package Sword;
import java.util.Arrays;
/**
* 二叉搜索树的后序遍历序列
* @author tyler
*
*/
public class Solution{
public boolean VerifySquenceOfBST(int [] sequence) {
// 异常
if(sequence == null || sequence.length <= 0){
return false;
}
// 调用功能函数
return VerifyCore(sequence, sequence.length);
}
//--------功能函数,形参改变--------------------------------
public boolean VerifyCore(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; // 此时的i为右子树部分第一个元素下标
}
// 判断右子树部分是否满足:右子树节点值大于根节点
int j = i;
for(;j < length-1;++j ){
if(sequence[j] < root)
return false; // 此时右子树部分节点必须全部大于根节点,否则不是二叉树搜索树
}
// 递归判断左子树是否为二叉搜索树
boolean left = true;
if(i > 0){
left = VerifyCore(sequence, i);
}
// 右
boolean right = true;
if(i < length - 1){
right = VerifyCore(Arrays.copyOfRange(sequence, i, length - 1),length - i - 1);
}
return (left && right);
}
}
举一反三
面對二叉树的遍历序列,先找到二叉树的根节点,再根据遍历特点将序列拆分为左右子树序列,然后递归处理这两个子序列。
基本结构:
1、前序遍历:根 ------- 左(比根小)------ 右(比根大);
2、中序遍历:左(比根小)------- 根 ------右(比根大);
3、后序遍历:左(比根小)------ 右(比根大)-------根;