LeetCode No449. 序列化和反序列化二叉搜尋樹
阿新 • • 發佈:2022-05-12
題目
序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。
設計一個演算法來序列化和反序列化 二叉搜尋樹 。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。
編碼的字串應儘可能緊湊。
示例 1:
輸入:root = [2,1,3]
輸出:[2,1,3]
示例 2:
輸入:root = []
輸出:[]
提示:
樹中節點數範圍是 [0, 10^4]
0 <= Node.val <= 10^4
題目資料 保證 輸入的樹是一棵二叉搜尋樹。
思路
對數的序列化其實就是遍歷樹,前序遍歷或者後序遍歷都可,反序列化而言,只要只要前序遍歷或者後序遍歷,然後再加上中序遍歷即可將樹反序列化回來,而且題目給的數是二叉搜尋樹,中序遍歷其實就是前序遍歷或者後序遍歷的排序順序,但是事實上我們是可以不用真實的去把中序遍歷構建出來,根據二叉搜尋樹的特殊性(左節點比根小,右節點比根大),就只要知道前序或後序遍歷中的其中一種即可,我這邊用的是前序遍歷。
AC程式碼
點選檢視程式碼
/** * 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) { List<Integer> list = new ArrayList<>(); preOrder(root, list); return list.toString(); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { data = data.substring(1, data.length()-1); if( data.isEmpty() ) { return null; } String[] str = data.split(", "); return DFS(0, str.length-1, str); } private void preOrder(TreeNode node, List<Integer> list) { if( node == null ) { return ; } list.add(node.val); preOrder(node.left, list); preOrder(node.right, list); } private TreeNode DFS(int low, int high, String[] str) { if( low > high ) { return null; } int num = Integer.parseInt(str[low]); TreeNode res = new TreeNode(num); int mid = low + 1; // 左節點都比根節點小 while( mid<=high && Integer.parseInt(str[mid])<=num ) { mid ++; } res.left = DFS(low+1, mid-1, str); res.right = DFS(mid, high, str); return res; } } // Your Codec object will be instantiated and called as such: // Codec ser = new Codec(); // Codec deser = new Codec(); // String tree = ser.serialize(root); // TreeNode ans = deser.deserialize(tree); // return ans;