剑指offer:二叉搜索树的后序遍历
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入描述
样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No
解题思路
一、非递归
-
对于一个二叉排序树而言,根节点大于左子树上任意节点,小于右子树上任意节点,并且没有值相同的节点。
-
后序遍历中,最后一个节点就是根节点。
-
所以可以不断去除序列最后一个值,如果是二叉排序树,那么一定存在一个位置,
【0,index)之间的值小于序列最后一位,【index,end)之间的值大于序列最后一位,
并且【0,end)长度一定等于arr.length-2。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
int[] arr = sequence;
if(arr == null || arr.length <= 0) return false; //数组为空 或 长度为0
int start = 0; int end = arr.length - 1;
while(end > 0){ //去掉数组最后一个元素之前,一直循环
while(arr[start] < arr[end]){ //找到index,退出
start ++;
}
while(arr[start] > arr[end]){ //从index向后比较
start ++;
}
if(start < end){ //start = end 说明是二叉排序树 ,start < end 说明不是
return false;
}
end --; //去掉数组最后一个元素
start = 0; //start归0
}
return true;
}
}
二、递归
-
对于整个序列而言,index是一个分界点,index左边的值都属左子树,index右边的值都属于右子树。
-
【0,index)范围内的值是一颗新的二叉排序树,【index,end)范围内的的值是另一颗二叉排序树。
-
可以将以
root为根节点的二叉排序树不断分解成新的二叉排序树,再逐个比较是不是二叉排序树。public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { int[] arr = sequence; if(arr == null || arr.length <= 0) return false; //arr为空 或 arr为false return isBST(arr,0,arr.length-1); } private boolean isBST(int[] arr,int start,int end){ if(start >= end){ return true; //说明已经分解到最小 } int root = arr[end]; int i = start; for(;i < end;i++){ //从start开始比较 if(arr[i] > root){ //找到index位置 break; } } int j = i; for(;j < end;j++){ //从index向后比较 if(arr[j] < root){ //出现小于arr[index]的元素,说明不是二叉排序树 return false; } } return isBST(arr,start,i-1) && isBST(arr,i,end-1); //向下分解 } }

浙公网安备 33010602011771号