剑指oofer 62 - 序列化二叉树

将二叉树序列化,前序遍历,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";
	else
		cout<<"Failed\n\n";
}

	//            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(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();
    Test6();

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值