最近面试遇到这个题,然后上网找了视频看,看完就随手记录一下。
public class TreeNoteTest {
public static void main(String[] args) {
//创建树
TreeNote root = new TreeNote("1");
TreeNote root1 = new TreeNote("2");
TreeNote root2 = new TreeNote("3");
TreeNote root3 = new TreeNote("4");
TreeNote root4 = new TreeNote("5");
root.setLeftTreeNote(root1);
root.setRightTreeNote(root2);
root1.setLeftTreeNote(root3);
root2.setRightTreeNote(root4);
StringBuilder sbd = new StringBuilder();
xuliehua(root, sbd);//序列化
System.out.println(sbd);//输出结果为 1!2!4!#!#!#!3!#!5!#!#!
//把字符串变成数组方便操作
String[] str = sbd.toString().split("!");
if(str!=null&&str.length>0){
root = fanxuliehua(str);//反序列化,返回树的根节点
}
}
//序列化(先序)
public static void xuliehua(TreeNote root, StringBuilder sbd){
if(root==null){
sbd.append("#!");//如果节点为空,就加"#"(任意定义一个就行),"!"表示结束
return;
}
sbd.append(root.getVal()+"!");
//递归左右子节点
xuliehua(root.getLeftTreeNote(), sbd);
xuliehua(root.getRightTreeNote(), sbd);
}
static int index = 0;
//反序列化
public static TreeNote fanxuliehua(String[] str){
if("#".equals(str[index])){
++index;
return null;
} else {
TreeNote root = new TreeNote(str[index]);
++index;
//递归左右子节点
root.setLeftTreeNote(fanxuliehua(str));
root.setRightTreeNote(fanxuliehua(str));
return root;
}
}
}
public class TreeNote {
private String val;
private TreeNote leftTreeNote;
private TreeNote rightTreeNote;
public TreeNote(){
}
public TreeNote(String val){
this.val = val;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public TreeNote getLeftTreeNote() {
return leftTreeNote;
}
public void setLeftTreeNote(TreeNote leftTreeNote) {
this.leftTreeNote = leftTreeNote;
}
public TreeNote getRightTreeNote() {
return rightTreeNote;
}
public void setRightTreeNote(TreeNote rightTreeNote) {
this.rightTreeNote = rightTreeNote;
}
}