《劍指offer》:[62]序列化二叉樹
題目:請實現兩個函式,分別來序列化和反序列化二叉樹。
方案分析:我們知道通過二叉樹的中序和任何一個前或者後續遍歷都可以反序列化一棵二叉樹,但是這樣做有一個缺點就是,序列化的資料不能有重複的資料,否則會出錯。另外,在反序列化時,需要知道中序和另外的任意一種序列才行,如果兩課二叉樹在字元流裡讀出,且二叉樹的資料比較多,則會相當的耗時。所以,這裡我們採取前序遍歷來完成序列化和反序列化,因為我們都知道用前序遍歷建立過二叉樹。只不過這裡如果一旦遇到NULL結點,我們需要用其他的字元來代替它。這樣在反序列化時才不會出錯,時間複雜度為O(N)。
具體序列化結果如下:
#include <iostream>
using namespace std;
struct BinaryTree
{
int data;
BinaryTree *pLeft;
BinaryTree *pRight;
};
int Data[15]={0};
static int count=0;
static int count1=-1;
BinaryTree *pRoot=NULL;
BinaryTree *pRoot1=NULL;
void CreateTree(BinaryTree * &root)
{
int data;
cin>>data;
if(0==data)
root=NULL;
else
{
root=new BinaryTree;
root->data=data;
CreateTree(root->pLeft);
CreateTree(root->pRight);
}
}
void Serialize(BinaryTree *root) //序列化;
{
if(root==NULL)
{
Data[count++]=0;
cout<<"0,";
return;
}
cout<<root->data<<",";
Data[count++]=root->data;
Serialize(root->pLeft);
Serialize(root->pRight);
}
void DeSerialize(BinaryTree *&root)
{
count1++;
if(!Data[count1])
root=NULL;
else
{
root=new BinaryTree;
root->data=Data[count1];
DeSerialize(root->pLeft);
DeSerialize(root->pRight);
}
}
void preorder(BinaryTree *root)
{
if(root)
{
cout<<root->data<<" ";
preorder(root->pLeft);
preorder(root->pRight);
}
}
int main()
{
CreateTree(pRoot);
cout<<"原始序列前序遍歷:";
preorder(pRoot);
cout<<endl<<"序列化後輸出:";
Serialize(pRoot);
cout<<endl;
DeSerialize(pRoot1);//反序列化;
cout<<"反序列化後的前序遍歷輸出:";
preorder(pRoot1);
cout<<endl;
system("pause");
return 0;
}
程式碼中NULL值用0代替,序列化與反序列化的執行結果:
相關文章
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 【劍指offer】樹的子結構
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 劍指 Offer 32 - I. 從上到下列印二叉樹(java解題)二叉樹Java
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- LeetCode 劍指offer——從上到下列印二叉樹 II、從上到下列印二叉樹 IIILeetCode二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- PHPer面試必看:分門別類帶你擼《劍指Offer》之二叉樹PHP面試二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 劍指 Offer 32 - II. 從上到下列印二叉樹 II 做題筆記二叉樹筆記