序列化是將乙個資料結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在乙個檔案或者記憶體中,同時也可以通過網路傳輸到另乙個計算機環境,採取相反方式重構得到原資料。
請設計乙個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證乙個二叉樹可以被序列化為乙個字串並且將這個字串反序列化為原始的樹結構。
示例:
你可以將以下二叉樹:
1/ \
2 3
/ \4 5
序列化為 "[1,2,3,null,null,4,5]"
記錄樹的前序遍歷序列(空節點也要記錄,使用'#'表示),節點之間使用分隔符|
進行分割。例如,示例中的樹,其前序序列為1|2|#|#|3|4|#|#|5|#|#|
,分割符的存在使得處理節點值是負數以及節點值是多位數字時更加方便。得到序列後,在反序列化時,首先將序列化的字串按照分隔符|
分開,然後根據序列使用先序建立二叉樹的方法建立二叉樹即可。**如下:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class codec
void serializecore(treenode* root, string& s)
s += to_string(root->val)+'|';
serializecore(root->left, s);
serializecore(root->right, s);
}// decodes your encoded data to tree.
treenode* deserialize(string data)
};// your codec object will be instantiated and called as such:
// codec codec;
// codec.deserialize(codec.serialize(root));
// 超時
該方法由於超時未通過,大概是因為分割字串需要大量時間。
思路2的思想大致和思路1相同。思路1超時的原因是先對字串進行分割,然後根據分割後的字串陣列建樹,而分割字串需要耗費大量時間。為了加快速度,可以邊建樹邊分割字串。我們使用兩個指標left和right標記當前字串的範圍,用substr提取出當前字元後建樹。**如下(序列化**和思路1一樣,對反序列化**進行了更改):
/**
* definition for a binary tree node.
* struct treenode
* };
*/class codec
void serializecore(treenode* root, string& s)
s += to_string(root->val)+'|';
serializecore(root->left, s);
serializecore(root->right, s);
}// decodes your encoded data to tree.
treenode* deserialize(string data)
treenode* deserializecore(string data, int& left, int& right)
};// your codec object will be instantiated and called as such:
// codec codec;
// codec.deserialize(codec.serialize(root));
前面兩種方法通過dfs建樹,思路3使用bfs建樹。首先儲存樹的層序遍歷序列(空節點儲存為#
,節點之間使用|
分割)。得到層序遍歷**後,再通過佇列重建樹,**如下:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class codec else
}return s;
}// decodes your encoded data to tree.
treenode* deserialize(string data)
i++;
if(tokens[i]!="#")
i++;
q.pop();
}return root;
}};// your codec object will be instantiated and called as such:
// codec codec;
// codec.deserialize(codec.serialize(root));
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...
leetcode 二叉樹 二叉樹的層次遍歷
給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回其層次遍歷結果 3 9,20 15,7 方法一 遞迴 思路 比較訪問節點所在層次level和當前最高層次len levels 判定是否需...