引子
在以前写WEB后台的时候,我们就见过各种异常,比如POST或者GET的值没过来,如果这时候只写了逻辑操作,就会带来问题,PHP中是用isset函数(PHP处理这些确实很方便),判断是否存在。因为我们实际的生产环境不可能只输入正确的值,错误,或者说异常处理就显得非常重要。
在大学上UNIX操作系统选修课时,老师叫段翰聪,是位很厉害的LINUX骨灰级玩家。他说,一个程序,对错误处理的代码一般是要占至少一半,很多都是占了三分之二,现在想来,这句话挺经典的。
正文
下面还是上代码,是一道比较经典的算法题目。有二叉树的前序,中序(数组描述),还原整个二叉树
class BinaryTree {
private Object data;
BinaryTree left;
BinaryTree right;
public BinaryTree(Object data){
this.data=data;
left=right=null;
}
public BinaryTree(Object data,BinaryTree left,BinaryTree right){
this.data=data;
this.left=left;
this.right=right;
}
public String toString(){
return data.toString();
}
public void preOrder(BinaryTree parent){
if(parent ==null)
return ;
System.out.print(parent.data+" ");
preOrder(parent.left);
preOrder(parent.right);
}
public void inOrder(BinaryTree parent){
if(parent==null)
return ;
inOrder(parent.left);
System.out.print(parent.data+" ");
inOrder(parent.right);
}
public void laOrder(BinaryTree parent){
if(parent==null)
return ;
inOrder(parent.left);
inOrder(parent.right);
System.out.print(parent.data+" ");
}
package Tree;
/**
* Created by Administrator on 2016/11/16.
*/
//构建二叉树,根据前序和中序的顺序。还可以打印后序
public class test6 {
public BinaryTree Construct(int []pre,int[]in){
if(pre==null||in==null)
return null;
if(pre.length<=0||pre.length!=in.length)
return null;
BinaryTree root=ConstructCore(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
//递归函数核心
private BinaryTree ConstructCore(int []pre,int startPre,int endPre,int[]in,int startIn,int endIn){
if(startPre>endPre||startIn>endIn)
return null;
//创建,根节点,值为前序序列的第一个值
BinaryTree root=new BinaryTree(pre[startPre]);
for(int i=startIn;i<=endIn;i++)
if(in[i]==pre[startPre]){
root.left=ConstructCore(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=ConstructCore(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
}
return root;
}
public static void main(String [] args){
int []pre={1,2,4,7,3,5,6,8};
int []in={4,7,2,1,5,3,6,8};
test6 a=new test6();
BinaryTree root=a.Construct(pre,in);
root.preOrder(root);
System.out.println("");
root.laOrder(root);
}
}
这个算法的思想跟二叉树的大部分算法思想一样,都是利用递归,先在中序序列里找到根节点,然后把左子树和右子树当成二叉树,进行递归,最后返回根节点的位置,此时就可以以进行打印,为了测试就打印了前序和后序。
在算法中,也注意到了一些边界值和逻辑判断,比如数组是否为空,前序和后序是否相等等。但在最后进行递归的时候,一个很重要的一点,这里用了for循环,找出中序数组里根节点的位置。但假如输入的数组,不存在两个一样的值(当然这种情况比较少),这个函数就会在创建了根节点后直接返回root,不会有任何错误提示,这是一个小缺点。
说了这么多,总结一下,从写程序的角度来说,一定要判断各种可能出现的异常情况,然后进行相应的输出提示或处理,这样写出来程序用户体验才会好。当然,人无完人,多检查,多测试。