序列化二叉树 java_剑指offer 序列化二叉树

题目描述:

请实现两个函数,分别用来序列化和反序列化二叉树。

分析:

根据前序遍历的顺序来进行序列化,前序遍历是从根结点开始,在遍历二叉树碰到null指针时,就将其序列化为一个特殊字符,比如#,另外,结点的数值之间用一个特殊字符(比如,)进行分隔。比如对于以下的树,序列化为字符串:"1,2,4,#,#,#,3,5,#,#,6,#,#"。

然后我们可以以"1,2,4,#,#,#,3,5,#,#,6,#,#"为例来分析反序列化的过程,第一个读出1,这是根结点的值,然后读出2,这是根结点的左孩子,同样接下来的4是值为2的结点的左孩子结点;接下来读出两个“#”,说明值为4的结点左右孩子都是null,这是一个叶结点。然后回到值为2的结点,重建它的右子树,由于下一个字符是“#”,说明值为2的结点的右孩子结点为null,这个结点的左右子树都重建完毕,接下来再次回溯就到了根结点,所以,左子树重构完毕。

由于下一个数字是3,所以右子树的根结点值为3,左结点时一个值为5的叶结点(因为接下来的三个字符是5,#,#),同理右结点时一个值为6的结点。至此,重构完毕,反序列化完成。

序列化比较简单,就是一个前序遍历的过程,而反序列化也不难发现,实际就是一个递归解决每个子树的问题,详见以下代码实现。

python版本示例代码:

class TreeNode:

def ___init__(self, x):

self.val = x

self.left = None

self.right = None

class Solution:

def Serialize(self, pRoot):

retlist = []

def preOrder(pRoot):

if pRoot == None:

retlist.append("#")

retrun

retlist.append(str(pRoot.val))

preOrder(pRoot.left)

preOrder(pRoot.right)

preOrder(pRoot)

return " ".join(retlist)

def Deserialize(self, s):

retlist = s.split()

def dePreOrder():

if retlist == []:

return None

rootVal = retlist[0]

del retlist[0]

if rootVal == "#":

return None

node = TreeNode(int(rootVal))

leftNode = dePreOrder()

rightNode = dePreOrder()

node.left = leftNode

node.right = rightNode

return node

pRoot = dePreOrder()

return pRoot

Java版本示例代码:

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 root) {

// 序列化为前序遍历序列,空节点用#表示 String str = "";

return Serialize(root, str);

}

String Serialize(TreeNode root, String str) {

if (root == null) { //序列化根节点 str += "#,";

return str;

} else

str += root.val+",";

str = Serialize(root.left, str); //序列化左子树 str = Serialize(root.right, str); //序列化右子树 return str;

}

int start=-1;

//反序列化,根据序列重构建树 TreeNode Deserialize(String str) {

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

return null;

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

return Deserialize(strArr);

}

TreeNode Deserialize(String[] strArr) {

start++;

if (start < strArr.length && !strArr[start].equals("#")) {

TreeNode cur = new TreeNode(Integer.parseInt(strArr[start]));

cur.left = Deserialize(strArr);

cur.right = Deserialize(strArr);

return cur;

}

return null;

}

}欢迎关注,一起学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值