序列化和反序列化二叉树
文章目录
//序列化以及反序列化二叉树
//从根节点开始序列化,就可以从根节点开始反序列化,前序遍历输出节点
#include <iostream>
#include"../common/ConstructBST.h"
#include<stdio.h>
#include<fstream>
#include<algorithm>
using namespace std;
void Serialize(BinaryTreeNode* pRoot,ostream& stream){
if(pRoot==NULL){
stream<<"$,";//没有节点或者叶子节点的左右子节点用这个符号代替
return;
}
stream<<pRoot->m_nValue<<",";
Serialize(pRoot->m_pLeft,stream);
Serialize(pRoot->m_pRight,stream);
}
bool ReadStream(istream& stream, int* number)
{
if(stream.eof())//判断文件是否为空或者是否读到文件结尾,eof()函数返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符
return false;
char buffer[32];
buffer[0] = '\0';
char ch;
stream >> ch;
int i = 0;
while(!stream.eof() && ch != ',')
{
buffer[i++] = ch;
stream >> ch;
}
bool isNumeric = false;
if(i > 0 && buffer[0] != '$')
{
*number = atoi(buffer);
isNumeric = true;
}
return isNumeric;
}
void Deserialize(BinaryTreeNode** pRoot,istream& stream){
int number;
if(ReadStream(stream,&number)){
*pRoot=new BinaryTreeNode();
(*pRoot)->m_nValue=number;
(*pRoot)->m_pLeft=NULL;
(*pRoot)->m_pRight=NULL;
Deserialize(&((*pRoot)->m_pLeft),stream);
Deserialize(&((*pRoot)->m_pRight),stream);
}
}
// ==================== Test Code ====================
bool isSameTree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2)
{
if(pRoot1 == NULL && pRoot2 == NULL)
return true;
if(pRoot1 == NULL || pRoot2 == NULL)
return false;
if(pRoot1->m_nValue != pRoot2->m_nValue)
return false;
return isSameTree(pRoot1->m_pLeft, pRoot2->m_pLeft) &&
isSameTree(pRoot1->m_pRight, pRoot2->m_pRight);
}
void Test(char* testName, BinaryTreeNode* pRoot)
{
if(testName != NULL)
printf("%s begins: \n", testName);
PrintTree(pRoot);
char* fileName = "test.txt";
ofstream fileOut;
fileOut.open(fileName);
Serialize(pRoot, fileOut);
fileOut.close();
// print the serialized file
ifstream fileIn1;
char ch;
fileIn1.open(fileName);
while(!fileIn1.eof())
{
fileIn1 >> ch;
cout << ch;
}
fileIn1.close();
cout << endl;
ifstream fileIn2;
fileIn2.open(fileName);
BinaryTreeNode* pNewRoot = NULL;
Deserialize(&pNewRoot, fileIn2);
fileIn2.close();
PrintTree(pNewRoot);
if(isSameTree(pRoot, pNewRoot))
printf("The deserialized tree is same as the oritinal tree.\n\n");
else
printf("The deserialized tree is NOT same as the oritinal tree.\n\n");
DestroyTree(pNewRoot);
}
// 8
// 6 10
// 5 7 9 11
void Test1()
{
BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
ConnectTreeNodes(pNode8, pNode6, pNode10);
ConnectTreeNodes(pNode6, pNode5, pNode7);
ConnectTreeNodes(pNode10, pNode9, pNode11);
Test("Test1", pNode8);
DestroyTree(pNode8);
}
// 5
// 4
// 3
// 2
void Test2()
{
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
ConnectTreeNodes(pNode5, pNode4, NULL);
ConnectTreeNodes(pNode4, pNode3, NULL);
ConnectTreeNodes(pNode3, pNode2, NULL);
Test("Test2", pNode5);
DestroyTree(pNode5);
}
// 5
// 4
// 3
// 2
void Test3()
{
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
ConnectTreeNodes(pNode5, NULL, pNode4);
ConnectTreeNodes(pNode4, NULL, pNode3);
ConnectTreeNodes(pNode3, NULL, pNode2);
Test("Test3", pNode5);
DestroyTree(pNode5);
}
void Test4()
{
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
Test("Test4", pNode5);
DestroyTree(pNode5);
}
void Test5()
{
Test("Test5", NULL);
}
// 5
// 5
// 5
// 5
// 5
// 5 5
// 5 5
void Test6()
{
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode2 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode3 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode4 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode61 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode62 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode71 = CreateBinaryTreeNode(5);
BinaryTreeNode* pNode72 = CreateBinaryTreeNode(5);
ConnectTreeNodes(pNode1, NULL, pNode2);
ConnectTreeNodes(pNode2, NULL, pNode3);
ConnectTreeNodes(pNode3, pNode4, NULL);
ConnectTreeNodes(pNode4, pNode5, NULL);
ConnectTreeNodes(pNode5, pNode61, pNode62);
ConnectTreeNodes(pNode61, pNode71, NULL);
ConnectTreeNodes(pNode62, NULL, pNode72);
Test("Test6", pNode1);
DestroyTree(pNode1);
}
int main()
{
Test1();
// Test2();
// Test3();
// Test4();
// Test5();
// Test6();
return 0;
}