二叉樹的序列化和反序列化以及奇偶樹
阿新 • • 發佈:2021-12-25
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Codec { // Encodes a tree to a single string. // 層序遍歷 (遍歷樹) public String serialize(TreeNode root) {if (root == null) return "[]"; String string = "["; Deque<TreeNode> que = new LinkedList<>(); que.offer(root); int cnt = 0; while (!que.isEmpty()) { TreeNode node = que.poll(); if (cnt != 0) string += ","; if (node == null) { string += "null"; } else { string += String.valueOf(node.val); que.offer(node.left); que.offer(node.right); } cnt ++; } string += "]"; return string; } // Decodes your encoded data to tree.// 建樹 public TreeNode deserialize(String data) { data = data.trim(); // 去除首尾兩端多餘的空格 data = data.substring(1, data.length() - 1); // 去除首尾兩端的'['、']' if ("null".equals(data) || data.length() == 0) return null; // [] String[] strings = data.split(","); TreeNode dummy = new TreeNode(-1); // 啞節點 TreeNode prev = dummy; Deque<TreeNode> que = new LinkedList<>(); int idx = 0; TreeNode root = new TreeNode(Integer.parseInt(strings[idx++])); dummy.left = root; que.offer(root); while (!que.isEmpty()) { TreeNode node = que.poll(); if ("null".equals(strings[idx])) { node.left = null; } else { node.left = new TreeNode(Integer.parseInt(strings[idx])); que.offer(node.left); } idx++; if ("null".equals(strings[idx])) { node.right = null; } else { node.right = new TreeNode(Integer.parseInt(strings[idx])); que.offer(node.right); } idx++; } return dummy.left; } } // Your Codec object will be instantiated and called as such: // Codec ser = new Codec(); // Codec deser = new Codec(); // TreeNode ans = deser.deserialize(ser.serialize(root));
// 二叉樹的序列化和反序列化考察的是:二叉樹的建樹和輸出的過程,必須記住
* 方法二: * 使用dfs進行搜尋,用map記錄每層最後遍歷到的節點 * 偶數下標 層上的所有節點的值都是 奇 整數,從左到右按順序 嚴格遞增 * 奇數下標 層上的所有節點的值都是 偶 整數,從左到右按順序 嚴格遞減 */ class Solution { Map<Integer, Integer> map = new HashMap<>(); // <每層序號, 每一層的最後節點> public boolean isEvenOddTree(TreeNode root) { return dfs(root, 0); } public boolean dfs(TreeNode node, int index) { boolean flag = index % 2 == 0? true: false; int prev = map.getOrDefault(index, flag? 0: 0x3f3f3f3f); int curr = node.val; if (flag && (curr % 2 == 0 || curr <= prev)) return false; if (!flag && (curr % 2 == 1 || curr >= prev)) return false; map.put(index, node.val); if (node.left != null && !dfs(node.left, index + 1)) return false; if (node.right != null && !dfs(node.right, index + 1)) return false; return true; } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ /** * 偶數下標為奇函式,嚴格遞增 * 奇數下標為偶函式,嚴格遞減 * 層序遍歷 */ class Solution { public boolean isEvenOddTree(TreeNode root) { Deque<TreeNode> que = new LinkedList<>(); que.offer(root); int level = 0; while (!que.isEmpty()) { int size = que.size(); TreeNode prev = null; for (int i = 0; i < size; i++) { TreeNode curr = que.poll(); if (level % 2 == 0) { if (curr.val % 2 != 1) return false; if (prev != null && curr.val <= prev.val) return false; } else { if (curr.val % 2 != 0) return false; if (prev != null && curr.val >= prev.val) return false; } prev = curr; if (curr.left != null) que.offer(curr.left); if (curr.right != null) que.offer(curr.right); } level++; } return true; } }
作者:Ryanjie
出處:http://www.cnblogs.com/ryanjan/
本文版權歸作者和部落格園所有,歡迎轉載。轉載請在留言板處留言給我,且在文章標明原文連結,謝謝!
如果您覺得本篇博文對您有所收穫,覺得我還算用心,請點選右下角的 [推薦],謝謝!