- 实现序列化和反序列化二叉树的函数
(1)序列化二叉树:就是采用前序遍历二叉树输出节点,再碰到左子节点或者右子节点为None的时候输出一个特殊字符“#”
前序遍历并打印,遇空节点也要打印一次,就得到前序序列化
(2)反序列化二叉树:根据某种遍历顺序得到的序列化字符串,重构二叉树
依次往后遍历序列,根据前序遍历顺序递归地生成节点,每次生成节点遇到”$”返回
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 Serialize(const BinaryTreeNode* pRoot, ostream& stream)
{
if (pRoot == nullptr)
{
stream << "$,";
return;
}
std::stack<const BinaryTreeNode*> myStack;
const BinaryTreeNode* pCurrNode = pRoot;
while (myStack.size()>0 || pCurrNode!=nullptr)
{
while (pCurrNode!=nullptr)
{
stream << pCurrNode->m_nValue << ",";
myStack.push(pCurrNode);
pCurrNode = pCurrNode->m_pLeft;
if (pCurrNode == nullptr)
stream << "$,";
}
if (myStack.size()>0)
{
pCurrNode = myStack.top();
myStack.pop();
if (pCurrNode->m_pRight!=nullptr)
pCurrNode = pCurrNode->m_pRight;
else
{
stream << "$,";
pCurrNode = nullptr;
}
}
}
return;
}
void Deserialize(BinaryTreeNode** pRoot, istream& stream)
{
int number;
if (ReadStream(stream, &number))
{
BinaryTreeNode* pNewNode = new BinaryTreeNode();
pNewNode->m_nValue = number;
*pRoot = pNewNode;
Deserialize(&(pNewNode->m_pLeft), stream);
Deserialize(&(pNewNode->m_pRight), stream);
}
return;
}