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;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章