判断输入数组是否为2叉树的后序排列
2014-03-19 20:23
197 查看
这个算法也是经典的面试题目。
package myTest; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub int array[] = {5, 7, 6, 9, 11, 10, 8}; new Test1().findAllAnswer(6, 6); System.out.println(new Test2().isPostOrder(array, 0, 6)); } } class Test1{ void findAllAnswer(int n,int dest){ int[]arr=new int ; helper(dest,0,arr,n); } private void helper(int dest, int i,int[] arr , int n) { // TODO Auto-generated method stub if(dest==0) prints(arr,n); if(dest<=0||i==n) return; helper(dest,i+1,arr,n); arr[i]=1; helper(dest-i-1,i+1,arr,n); arr[i]=0; } private void prints(int[] arr, int n) { // TODO Auto-generated method stub for(int i=0;i<n;i++){ if(arr[i]==1) System.out.print("+"+(i+1)); } System.out.println(); } } class Test2{ boolean isPostOrder(int[]arr,int s,int e){ int root=arr[e]; int start=s,middle; if(s==e) return true; while(start<e){ if(arr[start++]<=root)continue; else break; } middle=start-1; while(start<e){ if(arr[start++]<=root) return false; } if(isPostOrder(arr, s, middle)) return isPostOrder(arr, middle+1, e); else return false; } }
其中,上面的例子,Test2就是判断数组是否为后序排序的,思路相对来说,比较清晰,简单说一下,主要是观察这种排列有啥特点??
特点就是,数组最后一个是根,刚刚好数组前面的子序列,小于根,后面的序列全部大于根,进而分开的这两个子序列,又可以用递归的方法,进一步求解。
特别要注意递归的时候,下标,很容易出现错误,不动手写写,估计肯定是数组越界错误。
虽然这个版本不算是非常简洁的,但是个人认为,是思路比较清晰的一个。非常容易理解,共同学习。
相关文章推荐
- 连接器脚本
- openstack中的amqp
- ProgressBar、TrackBar and TabControl
- 图论知识
- <原创翻译>CSRSiRfstarIV GSD4e
- HDU 1019Least Common Multiple
- ural 1106 Two Teams
- 一见钟情之B/S
- ImageView(三)---拖拽+两点触碰缩放图片
- 判断一个正整数是否为质数的算法
- 什么是数字签名?
- 已知中序后序创建二叉树
- NYOJ 10 skiing
- J2EE--JDBC
- php中文api(带例子)
- mysql导入大文件SQL的方法
- 扩展BaseAdapter实现不存储列表项的listview
- 求高精度幂-----Exponentiation
- 敏捷软件开发方法综述
- 敏捷开发--经验交流