某子树的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
遍历算法
1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。
2.先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3) 遍历右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。
4.中序遍历的算法实现
用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf(“%c”,T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder
把str1和str2合并成一个新的String [] 并去掉其中重复的部分
String [] str1={“1001″,”1002″,”1003″};
String [] str2={“1001″,”1005″,”1010″,”1003″};
Vector v = new Vector();
for (int i = 0; i < str1.length; i ++) {
if (!v.contains(str1[i])) {
v.add(str1[i]);
}
}
for (int i = 0; i < str2.length; i ++) {
if (!v.contains(str2[i])) {
v.add(str2[i]);
}
}
String[] str1= new String[]{“1001″,”1002″,”1003″};
String[] str2= new String[]{“1001″,”1005″,”1010″,”1003″};
HashMap hp = new HashMap();
for(int i = 0 ; i < str1.length;i++){
hp.put(str1[i],”");
}
for(int i = 0 ; i < str2.length;i++){
hp.put(str2[i],”");
}
import java.util.*;
public class test1{
public static void main(String [] args){
String [] str1={“1001″,”1002″,”1003″};
String [] str2={“1001″,”1005″,”1010″,”1003″};
HashSet sh = new HashSet();
for(int i=0;i
sh.add(str1[i]);
for(int j=0;j
sh.add(str2[j]);
Iterator i =sh.iterator();
while(i.hasNext()){
System.out.println(i.next());
}}}
手机号码
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ClassPathResource {
public static boolean isMobileNO(String mobiles){
Pattern p = Pattern.compile(“^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$”);
Matcher m = p.matcher(mobiles);
System.out.println(m.matches()+”—”);
return m.matches();
}
public static void main(String[] args) throws IOException {
System.out.println(ClassPathResource.isMobileNO(“12016155153″));
}}
第二种方法:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
String value=”手机号”;
String regExp = “^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$”;
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(value);
return m.find();//Boolean
sturts与jsp结合
struts2中的Action接收表单传递过来的参数有3种方法:
如,登陆表单login.jsp:
用户名:
密 码:
1.在Action类中定义表单属性,两者属性名称必须一致。提供setter,getter方法。即可接收到表单传过来的参数.
这种接收参数的方法,方便简单,但是结构性不是很好,且当表单传递来的参数很多的时候,整个Action类中充斥着setter,getter方法,程序结构不是很美观。
2.把表单传递过来的参数封装成一个类,然后调用其中的属性.
如,把login.jsp页面要传来的参数进行封装
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
然后再Action方法中,定义该类的对象就可以了,如
public class loginAction extends ActionSupport{
private Users users;
public Users getUsers(){
return users;
}
public void setUsers(Users users){
this.users=users;
}
/*
传递过来的参数都封装在users中了,用getter方法取值就可以了
*/
}
通过这种方法传值,还必须在jsp页面做一下处理,login.jsp中from1的属性名应该改成这样:
登陆表单login.jsp:
用户名:
密 码:
这种方法,在struts开发中是很常用的一种方法!
3.通过实现ModelDriven接口接收表单数据
首先Action类必须实现ModelDriven接口,同样把表单传来的数据封装起来,Action类中必须实例化该对象,并且要重写getModel()方法
public class loginAction extends ActionSupport implements ModelDriven{
private Users users =new Users();
public Users getModel(){
return users;
}
/*
表单传来的参数封装在users对象中
表单属性名不需要加上引用users对象,直接传参数名
*/
}
hibernate与jdbc优缺点
1.hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对