1. 程式人生 > >劍指offer-序列化二叉樹

劍指offer-序列化二叉樹

integer ini ant ava and continue otto append ria

序列化二叉樹

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution {
    int index = -1;//字符數組指針 
String Serialize(TreeNode root) { //將樹序列化成字符串 if(root == null) return "#"; return "" + root.val + " " + Serialize(root.left) + " " + Serialize(root.right); // StringBuilder sb = new StringBuilder(); // if(root == null) { // return sb.append("#,").toString();
// } // sb.append(root.val + ","); // sb.append(Serialize(root.left)); // sb.append(Serialize(root.right)); // return sb.toString(); } TreeNode Deserialize(String str) { index++; String[] strr = str.split(" "); if(strr[index].equals("#")) return
null; TreeNode node = new TreeNode(Integer.valueOf(strr[index])); node.left = Deserialize(str); node.right = Deserialize(str); return node; } //層次打印二叉樹 public static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); ArrayList<Integer> ret = new ArrayList<>(); queue.add(root); while(!queue.isEmpty()) { TreeNode t = queue.poll(); if(t == null) continue; ret.add(t.val); queue.add(t.left); queue.add(t.right); } return ret; } public static void main(String[] args) { Solution solution = new Solution(); TreeNode s = new TreeNode(1); s.left = new TreeNode(2); s.right = new TreeNode(3); s.left.left = new TreeNode(4); s.left.right = new TreeNode(5); s.right.left = new TreeNode(6); s.right.right = new TreeNode(7); String s1 = solution.Serialize(s); System.out.println(s1); /**************************************/ String sstr = "1,2,#,5,#,#,3,6,#,#,#,"; String str = "1 2 4 # # 5 # # 3 6 # # 7 # # "; TreeNode node = solution.Deserialize(str); System.out.println(PrintFromTopToBottom(node)); } } /* t = TreeNode(8) t1 =TreeNode(6) t2 = TreeNode(10) t3 = TreeNode(5) t4 =TreeNode(7) t5 = TreeNode(9) t6 = TreeNode(11) t.left = t1 t.right = t2 t1.left = t3 t1.right = t4 t2.left = t5 t2.right = t6 print Solution().Serialize(t) print Solution().Deserialize(Solution().Serialize(t)) */

59ms

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {
public String serialize(TreeNode root) 
{
    if(root == null) return "#";
    
    return "" + root.val + " " + serialize(root.left) + " " + serialize(root.right);
}


// Decodes your encoded data to tree.
public TreeNode deserialize(String data) 
{
    return build(new Scanner(data));
}

private TreeNode build(Scanner sc)
{
    if(!sc.hasNext()) return null;
    String tk = sc.next();
    if(tk.equals("#")) return null;
    
    TreeNode root = new TreeNode(Integer.parseInt(tk));
    root.left = build(sc);
    root.right = build(sc);
    
    return root;
}
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

劍指offer-序列化二叉樹