Leetcode---二叉树的序列化与反序列化--递归

二叉树的序列化与反序列化

题目链接:二叉树的序列化与反序列化

思路:
  • 这道题。。。真是让我处理了很久啊。
  • 我的第一思路有两个,1.二叉树的层次遍历,再反序列化构造,这里就要求将二叉树当做完全二叉树遍历,空节点用“#”代替。第二个就是下面的错误思路。。。
  • 错误思路:我记得之前刷过一题,二叉树先序和中序重造二叉树,那么在序列化时,我准备采用将二叉树先序遍历和中序遍历的结果放在一个字符串里,然后序列化时将其拆开即可,顺着这个思路,错误越出越多,其中序列化结果是字符串,后来提交发现二叉树中存在为负值的节点,这就导致我转化为整数出错,正确方式是在每一个节点值拼接之后都再加上“,”,回头再按“,”拆分,这样做按理讲虽然复杂,但是应该也能做出来,我自定义的二叉树进行验证都没有问题,但是提交时遇到一个复杂的二叉树导致我提交错误,至今未发现哪里的问题。
  • 其实先序和中序我们知道其一就可以构造了,特殊的要求是null节点要用其他字符代替,这样我们就可以重造二叉树(之前一直以为一种遍历构造不出来)
  • 下边的代码是递归写的,比较易懂,但是运行时间较长。
public class Codec {
	int index = -1;
	// Encodes a tree to a single string.
	public String serialize(TreeNode root) {
		//此处先序遍历二叉树
		StringBuffer sb = new StringBuffer();
		if(root==null) {
			sb.append("#,");
			return sb.toString();
		}
		sb.append(root.val+",");
		sb.append(serialize(root.left));
		sb.append(serialize(root.right));
		System.out.println(sb.toString());
		return sb.toString();
	}

	// Decodes your encoded data to tree.
	public TreeNode deserialize(String data) {
		String[] temp = data.split(",");
		return deserialize(temp);

	}
	public TreeNode deserialize(String[] temp) {
		++index;
		TreeNode root = null;
		if(!temp[index].equals("#")) {
			root = new TreeNode(Integer.parseInt(temp[index]));
			root.left = deserialize(temp);
			root.right = deserialize(temp);
		}
		return root;

	}
}

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/85340541