/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root==null){
return null;
}
StringBuilder build = new StringBuilder();
Queue<TreeNode> q = new LinkedList();
q.offer(root);
while(!q.isEmpty()){
TreeNode node = q.poll();
if(node!=null){
build.append(node.val+",");
q.offer(node.left);
q.offer(node.right);
}else{
build.append("null,");
}
}
return build.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data==null||data.length()==0){
return null;
}
String[] s = data.split(",");
Queue<TreeNode> q = new LinkedList();
TreeNode node = new TreeNode(Integer.parseInt(s[0]));
q.offer(node);
int i = 1;
while(!q.isEmpty()){
TreeNode t = q.poll();
if(!s[i].equals("null")){
t.left = new TreeNode(Integer.parseInt(s[i]));
q.offer(t.left);
}
i++;
if(!s[i].equals("null")){
t.right = new TreeNode(Integer.parseInt(s[i]));
q.offer(t.right);
}
i++;
}
return node;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
字符串数组与队列之间的关系
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if not root:
return []
str_lst = []
return self.bfs(root, str_lst)
def bfs(self, root, str_lst):
queue = [root]
while queue:
cur, queue = queue[0], queue[1:]
str_lst.append(str(cur.val)) if cur else str_lst.append('null')
if cur:
queue.append(cur.left) if cur.left else queue.append(None)
queue.append(cur.right) if cur.right else queue.append(None)
return str_lst
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return None
root, data = TreeNode(data[0]), data[1:]
TreeNode_queue = [root]
flag = True
while data:
cur, data = data[0], data[1:]
tmp = TreeNode(int(cur)) if cur != 'null' else None
if TreeNode_queue:
pre = TreeNode_queue[0]
if flag:
pre.left = tmp
else:
pre.right = tmp
TreeNode_queue = TreeNode_queue[1:]
flag = not flag
if tmp:
TreeNode_queue.append(tmp)
return root
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if not root:
return ""
q = [root]
res = []
while q:
node = q.pop(0)
if node:
res.append(str(node.val))
q.append(node.left)
q.append(node.right)
else:
res.append("null")
# print(",".join(res))
return ",".join(res)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return None
nodes = data.split(",")
# print(nodes)
root = TreeNode(nodes[0])
q = [root]
i = 1
while q:
node = q.pop(0)
# print(i)
if nodes[i] != "null":
node.left = TreeNode(nodes[i])
q.append(node.left)
i += 1
if nodes[i] != "null":
node.right = TreeNode(nodes[i])
q.append(node.right)
i += 1
return root
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null) {
return "";
}
StringBuilder build = new StringBuilder();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
TreeNode node = q.poll();
if(node != null) {
q.offer(node.left);
q.offer(node.right);
build.append(node.val + ",");
} else {
build.append("null,");
}
}
return build.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data == null || data.length() <= 0){
return null;
}
String[] s = data.split(",");
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(s[0]));
queue.offer(root);
int i = 1;
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
//构建左子树,排出null
if(!s[i].equals("null")) {
TreeNode left = new TreeNode(Integer.parseInt(s[i]));
cur.left = left;
queue.offer(left);
}
i++;
//构建右子树,排出null
if(!s[i].equals("null")) {
TreeNode right = new TreeNode(Integer.parseInt(s[i]));
cur.right = right;
queue.offer(right);
}
i++;
}
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
共以下 26 个回答
“`java
难点是二叉树的唯一性和反序列化时的左右确定
public class Codec {
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
字符串数组与队列之间的关系
“`java
两个函数时间、空间复杂度都是为 O(n)
public class Codec {
// 序列化,使用层次遍历构建出一个字符串。 q=new LinkedList ();
// 层次遍历,使用 队列,并同时保存null
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(rootnull) return “”;
StringBuilder s= new StringBuilder();
Queue
q.add(root);
while(!q.isEmpty()){
TreeNode t= q.poll();
// 不为空则加入左右结点
if(t!=null){
s.append(t.val+”,”);
q.add(t.left);
q.add(t.right);
}else{
// 为空则加入null
s.append(“null,”);
}
}
return s.toString();
}
}
【思路】序列化时BFS遍历节点,将其转化为字符串拼接起来;反序列化逆向操作,两者都需要利用队列进行遍历。
【复杂度】时间空间均为O(n)
看到层序遍历加入字符串就有点思路了,跟层序遍历一样稍微做一些改动,就是把null也进行入队操作,然后抛出null的时候就将null也加入字符串,中间加一个间隔符进行区分,反序列化的话就是按照层序遍历的思想来做,遇到null就赋null不入队,遍历完就可以了
这段代码是一个用于序列化和反序列化二叉树的类。它使用层序遍历的方式将二叉树转化为一个字符串,并且可以将该字符串转化回原来的二叉树。
serialize方法接收一个二叉树的根节点作为参数,将二叉树序列化为一个字符串并返回。它使用了一个队列来进行层序遍历。首先将根节点加入队列,然后循环遍历队列中的节点,将节点的值转化为字符串并加入结果字符串中,同时将节点的左右子节点加入队列。如果节点为空,则将”null”加入结果字符串。最后返回结果字符串。
deserialize方法接收一个字符串作为参数,将该字符串反序列化为一个二叉树并返回。首先判断字符串是否为空,如果为空则返回nullptr。然后使用stringstream将字符串按照逗号分割成一个字符串数组。接着根据数组的第一个元素创建根节点。然后使用队列进行层序遍历,依次取出队列中的节点,根据字符串数组中的元素创建节点的左右子节点,并将其加入队列。最后返回根节点。
这段代码使用了队列和字符串流来实现二叉树的序列化和反序列化,是一种常用的实现方式。
按di哥思路来,时间和空间复杂度都是O(N)
思路:因为有“#”表示空节点,按照前序遍历建立字符串,以及建立二叉树
时间复杂度: O(n) 空间复杂度:O(n)
层次遍历,时间复杂度O(n),空间复杂度O(n)
层序
dfs
时间:O(n)
空间:O(n)
已经忘了按层打印是通过queue实现的了,正好复习一遍。
时间复杂度O(n)
空间复杂度O(n)
遍历+字符串相关操作。
使用null indicate the leaf node
看了视频 照着写 才会 哈哈
复杂度O(n)
class Codec {
public:
};
看了帅地讲解后就通了:
一个将二叉树转换成线性表的方法
一个将线性表转换成二叉树的方法
不过这里的线性表是带逗号的字符串
MY// 层序遍历
C++实现
时间复杂度和空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(2n)近似O(n)