LeetCode 297 二叉树的序列化与反序列化(超详细题解)

1、序列化

采用先根遍历的方法,必须把空节点加上

 

2、反序列化

序列化后的结果:"1,2,#,#,3,4,#,#,5,#,#"

那么,反序列化时,第一个字符一定是根节点,第二个字符一定是左子树的根节点了。

注意:一般情况下,如果只有前序遍历的话,并不能唯一确定一棵二叉树;

前序遍历 + 中序遍历,可以唯一确定一棵二叉树了。

为什么这道题,只用前序遍历就能唯一确定一棵二叉树呢?因为加上了空节点null

3、代码

package com.leetcode;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class 二叉树的序列化与反序列化_2 {
	class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;
		TreeNode(int x) { val = x; }
	}
	
	//序列化后的结果:"1,2,#,#,3,4,#,#,5,#,#"
	public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        dfs1(root, sb);
        return sb.toString();
    }
	
	private void dfs1(TreeNode root,StringBuilder sb) {
		if(root == null){
			sb.append("#,");  //空指针null代表一个#
			return;
		}
		sb.append(root.val + ",");
		dfs1(root.left, sb);
		dfs1(root.right, sb);
		
	}

	/**
	 * 反序列化  "1,2,#,#,3,4,#,#,5,#,#" 这个字符串
	 * @param data
	 * @return
	 */
	public TreeNode deserialize(String data) {
		String[] data_array = data.split(",");
		List<String> data_list = new LinkedList<>(Arrays.asList(data_array));
        return dfs2(data_list);
    }

	private TreeNode dfs2(List<String> data_list) {
		if(data_list.get(0).equals("#")){
			data_list.remove(0);
			return null;
		}
		int val = Integer.parseInt(data_list.get(0));
		data_list.remove(0);
		TreeNode root = new TreeNode(val);
		root.left = dfs2(data_list);
		root.right = dfs2(data_list);
		return root;
	}

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值