import java.util.LinkedList; import java.util.Queue; public class test16 { public static class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value = data; } } //先序的序列化过程,中序和后序有注释解释 public static Queue<String> preSerial(Node head){ Queue<String> ans = new LinkedList<>(); pres(head , ans); return ans; } public static void pres(Node head , Queue<String> ans){ if(head == null){ ans.add(null); }else{ //如果为先序,那么ans.add这句代码在前 //如果为中序,那么在中间 //如果为后序,那么在末尾 ans.add(String.valueOf(head.value)); pres(head.left , ans); pres(head.right , ans); } } public static Node buildByPreQueue(Queue<String> prelist){ if(prelist == null || prelist.size() == 0){ return null; } return preb(prelist); } public static Node preb(Queue<String> prelist){ String value = prelist.poll(); if(value == null){ return null; } //如果为先序,那么Node head这句代码在前 //如果为中序,那么Node head这句代码在中间 //如果为后序,那么Node head这句代码在末尾 Node head = new Node(Integer.valueOf(value)); head.left = preb(prelist); head.right = preb(prelist); return head; } //广度优先的序列化 public static Queue<String> levelSerial(Node head){ Queue<String> ans = new LinkedList<>(); if(head == null){ ans.add(null); }else{ ans.add(String.valueOf(head.value)); Queue<Node> queue = new LinkedList<>(); queue.add(head); while (!queue.isEmpty()){ head = queue.poll(); if(head.left != null){ ans.add(String.valueOf(head.left.value)); queue.add(head.left); }else{ ans.add(null); } if(head.right != null){ ans.add(String.valueOf(head.right.value)); queue.add(head.right); }else{ ans.add(null); } } } return ans; } //反序列化 public static Node buildByLevelQueue(Queue<String> levelList){ if(levelList == null || levelList.size() == 0){ return null; } Node head = generateNode(levelList.poll()); Queue<Node> queue = new LinkedList<>(); if(head != null){ queue.add(head); } Node node = null; while (!queue.isEmpty()){ node = queue.poll(); node.left = generateNode(levelList.poll()); node.right = generateNode(levelList.poll()); if(node.left != null){ queue.add(node.left); } if (node.right != null){ queue.add(node.right); } } return head; } public static Node generateNode(String val){ if(val == null){ return null; } return new Node(Integer.valueOf(val)); } }
二叉树的序列化(前序中序后序和广度优先)和反序列化
于 2024-07-29 20:30:18 首次发布