Java实现二叉树的序列化和反序列化

最近面试遇到这个题,然后上网找了视频看,看完就随手记录一下。

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;
	}
}

猜你喜欢

转载自blog.csdn.net/Hot__Coffee/article/details/81041643
今日推荐