您的位置:首页 > 其它

判断二叉搜索树的后序遍历序列是否合法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  遍历 搜索 二叉树