思路1:前序遍历递归。
思路2:前序遍历非递归。
思路3:层序遍历。
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { // 序列化 String Serialize(TreeNode node) { StringBuilder sb = new StringBuilder(); if (node == null){ sb.append("#!"); // 用#表示空节点 }else{ sb.append(node.val + "!"); sb.append(Serialize(node.left)); sb.append(Serialize(node.right)); } return sb.toString(); } // 反序列化写法1:利用substring截取字符串 // 注意:数值可能不只是个位数字,定义全局变量index(在字符串上的移动的指针),便于截取字符串中当前的结点值。 int index = 0; TreeNode Deserialize(String str) { TreeNode node = null; if (str == null || str.length() == 0) return node; int start = index; while (str.charAt(index) != ‘!‘){ index++; } if (!str.substring(start,index).equals("#")) {// substring前闭后开 node = new TreeNode(Integer.parseInt(str.substring(start,index))); index++; // 位置别放错了,插入一个节点后,index++,然后再递归 node.left = Deserialize(str); node.right = Deserialize(str); }else{ index++; } return node; } //反序列化写法2:使用split()转化为字符串数组 /*int index = 0; // 设置全局主要是遇到了#号的时候需要直接前进 TreeNode Deserialize(String str){ if (str == null || str.length() == 0) return null; String[] temp = str.split("!"); // 指定分隔符 TreeNode node = null; if (temp[index].equals("#")){ index++; }else{ node = new TreeNode(Integer.parseInt(temp[index])); index++; node.left = Deserialize(str); node.right = Deserialize(str); } return node; }*/ }
String转int类型时,Integer.parseInt(str) 与 Integer.valueOf(str)区别:
原文:https://www.cnblogs.com/HuangYJ/p/13632528.html