剑指oofer 62 - 序列化二叉树
来源:互联网 发布:联合国商品数据库 编辑:程序博客网 时间:2024/06/05 19:34
将二叉树序列化,前序遍历,NULL指针序列化成'$'字符,及诶单之间用',' 隔开。然后根据序列化结果反序列化出二叉树。
#include<iostream>#include<fstream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* CreateBinaryTreeNode(int value) { BinaryTreeNode* node = new BinaryTreeNode[sizeof(BinaryTreeNode)]; node->m_nValue = value; node->m_pLeft = node->m_pRight = NULL; return node; } void ConnectTreeNodes(BinaryTreeNode* pRoot,BinaryTreeNode* pLeft,BinaryTreeNode* pRight) { if(pRoot!=NULL) { pRoot->m_pLeft = pLeft; pRoot->m_pRight = pRight; } } void PrintTree(BinaryTreeNode* node){if(node!=NULL){cout<<node->m_nValue<<" ";if(node->m_pLeft)PrintTree(node->m_pLeft);if(node->m_pRight)PrintTree(node->m_pRight);}}void DestroyTree(BinaryTreeNode* node){if(node!=NULL){BinaryTreeNode* left = node->m_pLeft;BinaryTreeNode* right = node->m_pRight;delete node;node =NULL;DestroyTree(left);DestroyTree(right);}}void SerialTree(BinaryTreeNode* pRoot,ofstream &fileOut){if(pRoot==NULL){fileOut<<"$,";return ;}fileOut<<pRoot->m_nValue<<",";SerialTree(pRoot->m_pLeft,fileOut);SerialTree(pRoot->m_pRight,fileOut);}bool ReadStream(istream &stream, int *number){ if(stream.eof()) 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 DeserialTree(BinaryTreeNode** pRoot,ifstream &stream){int number; if(ReadStream(stream, &number)){ *pRoot = new BinaryTreeNode(); (*pRoot)->m_nValue =number; (*pRoot)->m_pLeft = (*pRoot)->m_pRight = NULL; DeserialTree(&(*pRoot)->m_pLeft ,stream);DeserialTree(&(*pRoot)->m_pRight ,stream);}}bool IsSame( BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2){if(pRoot1==NULL && pRoot2==NULL)return true;if(pRoot1==NULL || pRoot2==NULL)return false;if(pRoot1->m_nValue!=pRoot1->m_nValue)return false;return IsSame(pRoot1->m_pLeft,pRoot2->m_pLeft) && IsSame(pRoot1->m_pRight,pRoot2->m_pRight);}void Test(char *testName, BinaryTreeNode* pRoot){cout<<testName<<endl;PrintTree(pRoot);char *fileName= "test.txt";ofstream fileOut;fileOut.open(fileName);SerialTree(pRoot,fileOut);fileOut.close();cout<<endl;ifstream fileIn1;char ch;fileIn1.open(fileName);while(!fileIn1.eof()){fileIn1>>ch;cout<<ch;}fileIn1.close();ifstream fileIn2;fileIn2.open(fileName);BinaryTreeNode* pNewRoot = NULL;DeserialTree(&pNewRoot ,fileIn2);fileIn2.close();cout<<endl;PrintTree(pNewRoot);cout<<endl;if(IsSame(pRoot,pNewRoot))cout<<"Passed\n\n";elsecout<<"Failed\n\n";}// 8// 6 10// 5 7 9 11void 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// 2void 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// 2void 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 5void 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(int argc, char* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0;}
0 0
- 剑指oofer 62 - 序列化二叉树
- 剑指oofer 25 - 二叉树中和为某一值的路径
- 剑指oofer 22- 栈的压入、弹出序列
- 《剑指offer》:[62]序列化二叉树
- 二叉树序列化
- 二叉树序列化
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 序列化二叉树
- 二叉树序列化
- iOS开发UI高级—08控制器的创建
- 什么是云硬盘、云镜像和硬盘快照
- 使用微信支付后调回到自己客户端
- Datazen配置
- iOS开发UI高级—09控制器的View的创建
- 剑指oofer 62 - 序列化二叉树
- 什么是云数据库
- 关于unterminated argument list invoking macro \”%s\”"
- 黑马程序员——Java基础——多线程
- Eclipse的快捷键
- 什么是云服务器私有网络和防火墙
- leetcode[83]:Remove Duplicates from Sorted List
- 【整理】常见的数组排序方法以及代码实现
- 7 Steps for Learning Data Mining and Data Science