1. 程式人生 > 其它 >二叉樹的序列化和反序列化以及奇偶樹

二叉樹的序列化和反序列化以及奇偶樹

/**
 * 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/

本文版權歸作者和部落格園所有,歡迎轉載。轉載請在留言板處留言給我,且在文章標明原文連結,謝謝!

如果您覺得本篇博文對您有所收穫,覺得我還算用心,請點選右下角的 [推薦],謝謝!