二叉搜索树的后序遍历序列(剑指Offer33)

题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。

如果是返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

例如,输入{5,7,6,9,11,10,8},返回true。

输入{7,4,6,5},返回false。

 

在做这道题之前我们先来熟悉一下二叉搜索树的概念:

注意:二叉搜索树、二叉查找树(BST)、二叉排序树是同一个概念

二叉查找树:
1、若左子树不空,则左子树上所有结点的值均
小于或等于它的根结点的值;
2、若右子树不空,则右子树上所有结点的值均
大于或等于它的根结点的值;
3、左、右子树也分别为二叉查找树。
4、等于的情况只能出现在左子树或右子树中的
某一侧。
由于二叉查找树的中序遍历是从小到大的,故又名
二叉排序树。

 

思路:在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分两部分:

第一部分是左子树节点的值,它们都比根结点的值小;第二部分是右子树节点的值,它们都比根结点的值大;

思考一下,我们就可以想出程序中要用到递归。

根据根结点的值划分开左子树节点和右子树节点,用同样的方法分别处理左子树和右子树。

代码思路很清晰,好好看看代码哦!!

 1 public class Solution {
 2     public boolean VerifySquenceOfBST(int [] sequence) {
 3         return IsBST(sequence,0,sequence.length);
 4     }
 5     public boolean IsBST(int [] sequence,int begin,int end) {
 6         if(sequence==null||begin<0||end>sequence.length||end<=begin) {
 7             return false;
 8         }
 9         int root=sequence[end-1];
10         //在二叉搜索树中左子树节点的值小于根结点的值
11         int i=begin;
12         for(;i<end-1;i++) {
13             if(sequence[i]>root) {
14                 break;
15             }
16         }
17         //在二叉搜索树中右子树节点的值大于根结点的值
18         int j=i;
19         for(;j<end-1;j++) {
20             if(sequence[j]<root) {
21                 return false;
22             }
23         }
24         //判断左子树是不是二叉搜索树
25         boolean left=true;
26         if(i>begin) {
27             left=IsBST(sequence,begin,i);
28         }
29         //判断右子树是不是二叉搜索树
30         boolean right=true;
31         if(i<end-1) {
32             right=IsBST(sequence,i,end-1);
33         }
34         return (left&&right);        
35     }
36 }

 欢迎评论!!一起进步!!

posted @ 2019-06-17 14:44  zzu_Lee  阅读(606)  评论(0编辑  收藏  举报