package test; import java.util.LinkedList; import java.util.Queue; public class SeriaByLevel { // 按层遍历二叉树的方式序列化 public static String binToStr(Node head) { StringBuilder stringBuilder = new StringBuilder(); Queue<Node> queue = new LinkedList<>(); Node nNode = null; queue.offer(head); while (!queue.isEmpty()) { Node node = queue.poll(); if (node != null) { stringBuilder.append(node.val+"!"); } else { stringBuilder.append("#!"); continue; } if (node.left != null) { queue.offer(node.left); } else { queue.offer(nNode); } if (node.right != null){ queue.offer(node.right); } else { queue.offer(nNode); } } return stringBuilder.toString(); } // 按层遍历二叉树的方式反序列化 public static Node strToQueCeng(String string) { Queue<Node> queue = new LinkedList<>(); String values[] = string.split("!"); int index = 0; Node head = new Node(Integer.valueOf(values[index++])); queue.offer(head); while (!queue.isEmpty()) { Node node = queue.poll(); node.left = getNewNode(values[index ++]); node.right = getNewNode(values[index ++]); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } return head; } public static Node getNewNode(String val) { if (val.equals("#")) { return null; } else { return new Node(Integer.valueOf(val)); } } // 按层遍历二叉树 public static void nodePrint (Node head) { Node last = head; Node nlast = head; Queue<Node> queue = new LinkedList<>(); queue.offer(head); while (!queue.isEmpty()) { Node node = queue.poll(); System.out.print(node.val); System.out.print("\t"); if (node.left != null) { queue.offer(node.left); nlast = node.left; } if (node.right != null) { queue.offer(node.right); nlast = node.right; } if (last == node) { System.out.println(); last = nlast; } } } // 测试 public static void main(String[] args) { Node n1 = new Node(1); Node n2 = new Node(2); Node n3 = new Node(3); Node n4 = new Node(4); Node n5 = new Node(5); Node n6 = new Node(6); Node n7 = new Node(7); Node n8 = new Node(8); n1.left = n2; n1.right = n3; n2.left = n4; n3.left = n5; n3.right = n6; n5.left = n7; n5.right = n8; //测试序列化 String string = binToStr(n1); System.out.println(string); // 测试反序列化 Node head = strToQueCeng(string); nodePrint(head); } } class Node { Node left; Node right; int val; public Node () {} public Node (int val) { this.val = val; } }
【基础算法】二叉树的按层遍历序列化与反序列化
猜你喜欢
转载自blog.csdn.net/huiyudaoyi/article/details/80633780
今日推荐
周排行