二叉搜索树的后序遍历序列(剑指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 }
欢迎评论!!一起进步!!