判断二叉搜索树的后序遍历序列是否合法
2016-09-25 11:11
330 查看
简单的分析一下,后序遍历,遍历顺序为左右根,那么序列的最后一个节点必为根节点。由于二叉搜索树的性质,根节点的左子树所有值小于根节点的值,右子树大于根节点,那么,我们只需要将序列分为左子树(leftTree)和右子树(rightTree),然后将左子树(leftTree)再分为左子树(left_leftTree)和右子树(left_rightTree),右子树(rightTree)分为左子树(left_rightTree)和右子树(right_rightTree),依次根据二叉搜索树的性质,进行判断,直到没有节点或者不满足性质则停止。
很明显,可以用递归的思路去解决问题
import java.util.Arrays; /** * 判断所给定的后序遍历序列是否合法 * @author BayMax * */ public class AfterTree { public boolean isAfterTree(int[] sequence,int length){ int len = sequence.length; if(sequence==null || length<=0) return false; int i=0; int root = sequence[length-1]; for(;i<length-1;i++){ if(sequence[i]>root){ break; //得到左子树 i为大于root的点的下标 } } int j=i; //右子树起始点 for(;j<length-1;j++){ if(sequence[j]<root) return false; //若发现右子树中有小于根节点的值,则不合法 } boolean left = true; if(i>0) //这里需要使用数组拷贝,不然的话需要在函数中定义范围值例如isAfterTree(int[] sequence,int low,int high) left = isAfterTree(Arrays.copyOfRange(sequence, 0, i),i); boolean right = true; if(j<len-1) right = isAfterTree(Arrays.copyOfRange(sequence, i, j),length-i); return (left&&right); } public static void main(String[] args) { AfterTree a =new AfterTree(); int [] seq = new int[]{5,7,6,9,11,10,8}; int [] seq2 = new int[]{7,4,6,5}; int [] seq3 = new int[]{}; //空树 int [] seq4 = new int[]{1}; //一个根节点 int [] seq5 = new int[]{1,2}; //两个节点 System.out.println(a.isAfterTree(seq, seq.length)); System.out.println(a.isAfterTree(seq2, seq2.length)); System.out.println(a.isAfterTree(seq3, seq3.length)); System.out.println(a.isAfterTree(seq4, seq4.length)); System.out.println(a.isAfterTree(seq5, seq5.length)); } }
参考:
http://blog.csdn.net/scgaliguodong123_/article/details/46539173
相关文章推荐
- 二叉搜索树的后序遍历序列(判断后序遍历序列是否合法)
- 输入一个数列,判断是否为某一个二叉搜索树的后序遍历序列
- 判断给定的数组是否为二叉搜索树的后序遍历序列
- [PHP]算法- 判断是否为二叉搜索树的后序遍历序列的PHP实现
- 判断数组是否是二叉搜索树的后序遍历序列 JAVA实现
- 剑指offer解题报告(Java版)——判断一个数组是否是二叉搜索树的后序遍历序列 24
- 二叉搜索树的后序遍历序列序列判断是否是二叉搜索树
- 软件设计艺术大师基础--判断序列是否为二叉搜索树的后序遍历序列
- 判断二叉树的后序遍历序列是否合法
- 判断一个整数数组是不是二叉搜索树的后序遍历序列
- 判断二叉搜索树的后序遍历序列
- 判断二叉排序树的后序遍历是否合法
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- 《剑指offer》:[24]判断一个序列是否为二叉树的后序遍历序列
- 判断某数组是不是二叉搜索树的后序遍历序列
- 判断一个数据序列是否是BST后序遍历的结果
- 判断一个序列是否为某二叉搜索树的后续遍历结果
- 剑指offer:二叉搜索树的后序遍历序列(判断一个数组是否是二叉搜索树的后续遍历序列)
- 判断整数序列是否为二元查找树的后序遍历结果的解决方法