package com.niuke;
import org.junit.Test;
/**
* Created by admin on 2018/3/11.
* 请实现两个函数,分别用来序列化和反序列化二叉树
*
算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;
所谓反序列化指的是依据字符串重新构造成二叉树。依据前序遍历序列来序列化二叉树,
因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,
这些Null指针被序列化为一个特殊的字符“#”。另外,结点之间的数值用逗号隔开。
*/
public class SerializeAndDeserialize {
String Serialize(TreeNode root) {
StringBuffer sb=new StringBuffer();
if(root==null) {//到达叶子节点出递归
sb.append("#,");
return sb.toString();
}
sb.append(root.val+",");//先序遍历 中左右
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
int index=-1;
TreeNode Deserialize(String str) {
String []s=str.split(",");//将序列化之后的序列用,分隔符转化为数组
index++;//索引每次加一
int len=s.length;
if(index>len) {//鲁棒性
return null;
}
TreeNode treeNode=null;
if(!s[index].equals("#")) {//不是叶子节点 继续走 是叶子节点出递归
treeNode=new TreeNode(Integer.parseInt(s[index]));
treeNode.left=Deserialize(str);
treeNode.right=Deserialize(str);
}
return treeNode;
}
@Test
public void test() {
TreeNode s=new TreeNode(1);
s.left=new TreeNode(2);
s.right=new TreeNode(3);
s.left.left=new TreeNode(4);
s.left.right=new TreeNode(5);
s.right.left=new TreeNode(6);
s.right.right=new TreeNode(7);
String s1=Serialize(s);
System.out.print("-------------");
Deserialize(s1);
System.out.print("-------------");
}
}
请实现两个函数,分别用来序列化和反序列化二叉树
最新推荐文章于 2021-04-12 21:07:44 发布