Serialize and Deserialize tree

本文介绍了一种使用LinkedList实现二叉树节点的序列化与反序列化的方法,并提供了一个示例程序来验证其正确性。文章通过队列遍历的方式实现了树的层级遍历,能够有效地将树结构转化为列表形式并重新构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Serialize and Deserialize tree: 但是要自己写node structure 和 用linkedlist去存

package tree;

import java.util.*;

import z_dataStructure.TreeNode;

public class SerializationAndDe {
	public LinkedList<Integer> s(TreeNode root) {
		LinkedList<Integer> ret = new LinkedList<>();
		if (root == null) {
			return ret;
		}
		Deque<TreeNode> queue = new ArrayDeque<>();
		queue.offer(root);
		ret.add(root.val);
		while (!queue.isEmpty()) {
			TreeNode tn = queue.poll();
			if (tn.left != null) {
				queue.offer(tn.left);
				ret.add(tn.left.val);
			} else {
				ret.add(null);
			}
			if (tn.right != null) {
				queue.offer(tn.right);
				ret.add(tn.right.val);
			} else {
				ret.add(null);
			}
		}
		return ret;
	}

	public TreeNode d(LinkedList<Integer> list) {
		if (list.isEmpty()) {
			return null;
		}
		Iterator<Integer> it = list.iterator();
		TreeNode ret = new TreeNode(it.next());
		Deque<TreeNode> queue = new ArrayDeque<>();
		queue.offer(ret);
		while (!queue.isEmpty()) {
			TreeNode tn = queue.poll();
			Integer left = it.next();
			Integer right = it.next();
			if (left != null) {
				tn.left = new TreeNode(left);
				queue.offer(tn.left);
			}
			if (right != null) {
				tn.right = new TreeNode(right);
				queue.offer(tn.right);
			}
		}
		return ret;
	}

	public static void main(String[] args) {
		TreeNode tn1 = new TreeNode(1);
		TreeNode tn2 = new TreeNode(2);
		TreeNode tn3 = new TreeNode(3);
		TreeNode tn4 = new TreeNode(4);
		TreeNode tn5 = new TreeNode(5);
		TreeNode tn6 = new TreeNode(6);
		TreeNode tn7 = new TreeNode(7);
		TreeNode tn8 = new TreeNode(8);

		tn1.left = tn2;
		tn1.right = tn3;
		tn2.left = tn4;
		tn3.left = tn5;
		tn5.left = tn6;
		tn5.right = tn7;
		tn6.left = tn8;

		SerializationAndDe ss = new SerializationAndDe();
		TreeNode r = ss.d(ss.s(tn1));
		System.out.println(ss.sameTree(tn1, r));
		TreeNode r2 = ss.d(ss.s(null));
		System.out.println(ss.sameTree(null, r2));
		return;
	}

	private boolean sameTree(TreeNode r1, TreeNode r2) {
		if (r1 == null && r2 == null)
			return true;
		if (r1 != null && r2 != null && r1.val == r2.val)
			return sameTree(r1.left, r2.left) && sameTree(r1.right, r2.right);
		return false;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值