java二叉树的序列化_二叉树的序列化与反序列化(代码实现和思路)

今天要给大家分享的是关于二叉树的序列化与反序列化问题。请实现两个函数,分别用来序列化和反序列化二叉树,包含了具体的代码实现和思路。

二叉树的序列化:将一棵二叉树根据某一种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树能够长久保存。

序列化能够基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 !

代表着一个结点值的结束(value!)。

二叉树的反序列化:依据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

思路1://采用层序遍历,不需要将转化为完全二叉树的简单方法

public class Solution

{

String Serialize(TreeNode root)

{

StringBuilder sb = new StringBuilder();

Queue  queue = new LinkedList  ();

if (root != null)

queue.add(root);

while (!queue.isEmpty())

{

TreeNode node = queue.poll();

if (node != null)

{

queue.offer(node.left);

queue.offer(node.right);

sb.append(node.val + ",");

}

else

{

sb.append("#" + ",");

}

}

if (sb.length() != 0)

sb.deleteCharAt(sb.length() - 1);

return sb.toString();

}

TreeNode Deserialize(String str)

{

TreeNode head = null;

if (str == null || str.length() == 0)

return head;

String[] nodes = str.split(",");

TreeNode[] treeNodes = new Tr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树序列化是将一个二叉树转化成一个字符串,而反序列化则是将这个字符串转化成一个二叉树。下面是一个基于递归的 C 语言完整代码实现: ``` #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; /* 序列化二叉树 */ void serialize(TreeNode* root, char* str) { if(root == NULL) { strcat(str, "# "); // #表示空节点 return; } char tmp[20]; sprintf(tmp, "%d ", root->val); strcat(str, tmp); // 将当前节点的值加入字符串 serialize(root->left, str); // 递归序列化左子树 serialize(root->right, str); // 递归序列化右子树 } /* 反序列化二叉树 */ TreeNode* deserialize(char** str) { if(**str == '#') { // 如果当前字符是#,表示空节点 (*str)++; // 跳过空节点 return NULL; } int num = 0; while(**str != ' ') { // 将字符转换成数字 num = num * 10 + (**str - '0'); (*str)++; } (*str)++; // 跳过空格 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = num; // 创建当前节点 root->left = deserialize(str); // 递归创建左子树 root->right = deserialize(str); // 递归创建右子树 return root; } /* 打印二叉树 */ void print_tree(TreeNode* root) { if(root == NULL) { printf("# "); return; } printf("%d ", root->val); print_tree(root->left); print_tree(root->right); } int main() { TreeNode node1 = {1, NULL, NULL}; TreeNode node2 = {2, NULL, NULL}; TreeNode node3 = {3, &node1, &node2}; char str[100] = ""; serialize(&node3, str); printf("Serialized string: %s\n", str); TreeNode* root = deserialize(&str); printf("Deserialized tree: "); print_tree(root); return 0; } ``` 使用示例: 输入: ``` 3 / \ 1 2 ``` 输出: ``` Serialized string: 3 1 # # 2 # # Deserialized tree: 3 1 # # 2 # # ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值