把序列化二叉树讲给女朋友听
序列化二叉树
http://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84
首先按照题意,每一个节点后面都应该加一个"!",然后空节点使用"#"表示,这个是大前提;
其次,大体上的意思是先序遍历二叉树,得到遍历结果,然后根据遍历结果来生成树;
先序遍历肯定没什么问题,遇到空就加井号,遇到值就加值,不过记得加感叹号代表结束;
问题来了,之前都知道,只有先序遍历怎么可能得出唯一的树呢??但是此题不同,因为这道题把咱们的【空节点】都标出来了,所以能够得出唯一的树;
例如: ,这个二叉树很简单吧,序列化之后呢:1!2!#!#!3!#!#!,如果要是不加空节点的标志,那就是123,就根据123,那反序列后的二叉树还可能是这样呢 ,但是有了空节点的标志,咱们就可以进行反序列化了;
要先根据"!"把字符串分为字符数组[1, 2, #, #, 3, #, #]
然后遍历此数组生成树,所以我们需要一个全局变量记录下标index;
算法流程:先判断是否是"#",是的话就返回null(返回null,就相当于返回到了上一个节点了)
然后以当前节点创建树节点,然后递归创建左树和右树
代码如下:
String seqTree = ""; int index = 0; String Serialize(TreeNode root) { dfs(root); System.out.println("序列化之后的值为:"+seqTree); return seqTree; } void dfs(TreeNode root) { if (root == null) { seqTree += "#!"; return; } else { seqTree += String.valueOf(root.val) + "!"; } dfs(root.left); dfs(root.right); } TreeNode Deserialize(String str) { String[] nodes = str.split("!"); return helpDeserialize(nodes); } TreeNode helpDeserialize(String[] str) { if ("#".equals(str[index])) { index++; return null; } TreeNode node = new TreeNode(Integer.valueOf(str[index++])); node.left = helpDeserialize(str); node.right = helpDeserialize(str); return node; }