剑指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
原创粉丝点击