例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:首先我们要清楚二叉查找树后序遍历结果的特点:
1.数组最后一个元素为根节点
2.除去根节点前面部分分别为左子树和右子树(即比根节点小的左子树和比根节点大的右子树)
也就是说违背了上面两特点的都不是二叉查找树的后续遍历,具有判断性的特点只有第2个特点,(左子树都比根节点小,右子树都比根节点大)。
如5、7、6、9、11、10、8
红色部分为左子树,蓝色为右子树,黑色为根节点
代码编写具体思路:
1.找到第一个大于根节点的数,即9,所以9之后的为右子树
2.如果右子树的值都大于根节点8,则符合
3.递归法分别判断是否左子树和右子树都符合这种特点。
import java.util.* ; public class SearchTree{ public static boolean searchTree(int a[],int length){ boolean flag = true ; if(length<=0||a==null){ return false; } int root = a[length-1] ; int i = 0 ; while(a[i]<root){ i++ ; //得到左子树和右子树的分界线,a[i]为右子树第一个 } int j=i ; for(;j<length-1;++j){ if(a[j]<root){ flag = false ; } } if(i>0){ searchTree(a,i) ; } if(i<length-1){ searchTree(Arrays.copyOfRange(a,i,length-1),length-i-1) ; } return flag ; } public static void main(String args[]){ int a[] = {5,7,6,9,11,10,8} ; //true //int a[] = {7, 4, 6, 5} ; false System.out.println(searchTree(a,a.length)) ; } }
参考资料:
作者:SpeedMe 发表于2014-4-3 21:53:55 原文链接
阅读:186 评论:0 查看评论