LeetCode(算法)- 297. 二叉树的序列化与反序列化

简介: LeetCode(算法)- 297. 二叉树的序列化与反序列化

题目链接:点击打开链接

题目大意:

解题思路:

相关企业

  • Facebook
  • 亚马逊(Amazon)
  • 微软(Microsoft)
  • 谷歌(Google)
  • 英伟达(NVIDIA)
  • 优步(Uber)
  • 苹果(Apple)
  • 甲骨文(Oracle)

AC 代码

  • Java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/// Your Codec object will be instantiated and called as such:// Codec ser = new Codec();// Codec deser = new Codec();// TreeNode ans = deser.deserialize(ser.serialize(root));// 解决方案(1)publicclassCodec {
publicStringserialize(TreeNoderoot) {
StringBuildersb=newStringBuilder();
Queue<TreeNode>queue=newLinkedList<TreeNode>(){{offer(root);}};
while (!queue.isEmpty()) {
TreeNodenode=queue.poll();
if (node==null) {
sb.append(Integer.MAX_VALUE).append("#");
continue;
            }
sb.append(node.val).append("#");
queue.offer(node.left);
queue.offer(node.right);
        }
returnsb.toString();
    }
publicTreeNodedeserialize(Stringdata) {
String[] arr=data.split("#");
intptrPar=arr.length-1, ptrSub=arr.length-1;
Map<Integer, TreeNode>nodeMap=newHashMap<>();
Map<TreeNode, TreeNode>parLMap=newHashMap<>();
Map<TreeNode, TreeNode>parRMap=newHashMap<>();
booleanflag=true;
while (ptrPar>=0) {
// 定位父亲指针while (arr[ptrPar].equals(String.valueOf(Integer.MAX_VALUE))) {
ptrPar--;
            }
// 生成父节点TreeNodeparNode=newTreeNode(Integer.valueOf(arr[ptrPar]));
nodeMap.put(ptrPar--, parNode);
// 生成儿子节点TreeNodelNode, rNode;
if (nodeMap.containsKey(ptrSub)) {
rNode=nodeMap.get(ptrSub);
            } else {
IntegerarrValue=Integer.valueOf(arr[ptrSub]);
rNode=newTreeNode(arrValue);
if (!arrValue.equals(Integer.MAX_VALUE)) {
flag=false;
                }
if (flag) {
parRMap.put(rNode, parNode);
                }
            }
ptrSub--;
if (nodeMap.containsKey(ptrSub)) {
lNode=nodeMap.get(ptrSub);
            } else {
IntegerarrValue=Integer.valueOf(arr[ptrSub]);
lNode=newTreeNode(arrValue);
if (!arrValue.equals(Integer.MAX_VALUE)) {
flag=false;
                }
if (flag) {
parLMap.put(lNode, parNode);
                }
            }
ptrSub--;
// 组合节点parNode.right=rNode;
parNode.left=lNode;
        }
// 满二叉树转换完全二叉树(去除末尾的 NULL)convertTree(parLMap, parRMap);
returnnodeMap.get(0);
    }
privatevoidconvertTree(Map<TreeNode, TreeNode>parLMap, Map<TreeNode, TreeNode>parRMap) {
for (Map.Entry<TreeNode, TreeNode>item : parLMap.entrySet()) {
item.getValue().left=null;
        }
for (Map.Entry<TreeNode, TreeNode>item : parRMap.entrySet()) {
item.getValue().right=null;
        }
    }
}
// 解决方案(2)publicclassCodec {
publicStringserialize(TreeNoderoot) {
if(root==null) return"[]";
StringBuilderres=newStringBuilder("[");
Queue<TreeNode>queue=newLinkedList<>() {{ add(root); }};
while(!queue.isEmpty()) {
TreeNodenode=queue.poll();
if(node!=null) {
res.append(node.val+",");
queue.add(node.left);
queue.add(node.right);
            }
elseres.append("null,");
        }
res.deleteCharAt(res.length() -1);
res.append("]");
returnres.toString();
    }
publicTreeNodedeserialize(Stringdata) {
if(data.equals("[]")) returnnull;
String[] vals=data.substring(1, data.length() -1).split(",");
TreeNoderoot=newTreeNode(Integer.parseInt(vals[0]));
Queue<TreeNode>queue=newLinkedList<>() {{ add(root); }};
inti=1;
while(!queue.isEmpty()) {
TreeNodenode=queue.poll();
if(!vals[i].equals("null")) {
node.left=newTreeNode(Integer.parseInt(vals[i]));
queue.add(node.left);
            }
i++;
if(!vals[i].equals("null")) {
node.right=newTreeNode(Integer.parseInt(vals[i]));
queue.add(node.right);
            }
i++;
        }
returnroot;
    }
}
  • C++
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/// Your Codec object will be instantiated and called as such:// Codec ser, deser;// TreeNode* ans = deser.deserialize(ser.serialize(root));classCodec {
public:
// Encodes a tree to a single string.stringserialize(TreeNode*root) {
if(root==nullptr) return"[]";
stringres="[";
queue<TreeNode*>que;
que.emplace(root);
while(!que.empty()) {
TreeNode*node=que.front();
que.pop();
if(node!=nullptr) {
res+= (to_string(node->val) +",");
que.emplace(node->left);
que.emplace(node->right);
            }
elseres+="null,";
        }
res.pop_back();
res+="]";
returnres;
    }
// Decodes your encoded data to tree.TreeNode*deserialize(stringdata) {
if (data=="[]")
returnnullptr;
vector<string>list=split(data.substr(1, data.length() -2), ",");
TreeNode*root=newTreeNode(std::stoi(list[0]));
queue<TreeNode*>que;
que.emplace(root);
inti=1;
while(!que.empty()) {
TreeNode*node=que.front();
que.pop();
if(list[i] !="null") {
node->left=newTreeNode(std::stoi(list[i]));
que.emplace(node->left);
            }
i++;
if(list[i] !="null") {
node->right=newTreeNode(std::stoi(list[i]));
que.emplace(node->right);
            }
i++;
        }
returnroot;
    }
private:
// Split a str by a delimvector<string>split(stringstr, stringdelim) {
vector<string>list;
inti=0, j=0, len=str.length();
while (i<len) {
while (j<len&&str[j] !=',')
j++;
list.push_back(str.substr(i, j-i));
i=++j;
        }
returnlist;
    }
};
目录
相关文章
|
14天前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
43 9
 算法系列之数据结构-二叉树
|
5月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
65 0
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
64 2
|
3月前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
75 5
|
4月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
4月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
117 5
|
4月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
146 0
|
5月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
56 2
|
5月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
51 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)