剑指offer 23.二叉搜索树的后序遍历序列

23.二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路:

 二叉搜索树的根节点大于所有左子树结点,小于所有右子树结点,后序遍历的 顺序是 左 -> 右 -> 根, 所以最后的元素是根节点,中间第一个不小于 根节点的元素是右子树的第一个结点,所以据此找到分界点,递归判断左右子树
 1 public class Solution {
 2     // 二叉搜索树的根节点大于所有左子树结点,小于所有右子树结点,
 3     // 后序遍历的 结果是 左 -> 右 -> 根, 所以最后的元素是根节点,中间第一个不小于 根节点的元素是右子树的第一个结点
 4     // 找到分界点,递归判断左右子树
 5     public boolean VerifySquenceOfBST(int [] sequence) {
 6         if(sequence.length == 0)    // 如果数组长度为0,直接返回false
 7             return false;
 8         // 递归判断足有子树
 9         return helpVerify(sequence, 0, sequence.length - 1);
10     }
11     
12     public boolean helpVerify(int [] sequence, int start, int end){
13         if(start >= end)
14             return true;
15         // 找到分界点
16         int root = sequence[end];
17         int split = 0;            // 分界点的下标
18         for(; split < end && sequence[split] < root; split++);
19         
20         // 判断分结点右边的左右元素是否都大于根节点
21         for(int i = split; i < end; i++){
22             if(sequence[i] < root){
23                 return false;
24             }
25         }
26         // 递归判断左右子树
27         return helpVerify(sequence, 0, split - 1) && helpVerify(sequence, split, end - 1);
28     }
29 }

猜你喜欢

转载自www.cnblogs.com/hi3254014978/p/12357835.html