C++ Leetcode 297序列化和反序列化二叉树
所以我在做leetcode297。由于某些原因,我的反序列化助手函数的TreeNode指针将不会通过引用传递。我知道人们说我是多么愚蠢,因为指针是自动通过引用传递的。然而,我就是不明白为什么在这种情况下它不能通过引用传递。也许这不是问题所在。请帮帮我。这是我的密码:C++ Leetcode 297序列化和反序列化二叉树,c++,pointers,binary-tree,C++,Pointers,Binary Tree,所以我在做leetcode297。由于某些原因,我的反序列化助手函数的TreeNode指针将不会通过引用传递。我知道人们说我是多么愚蠢,因为指针是自动通过引用传递的。然而,我就是不明白为什么在这种情况下它不能通过引用传递。也许这不是问题所在。请帮帮我。这是我的密码: class Codec { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { vector<char&g
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
vector<char> solution;
serializeHelper( solution, root );
string result( solution.begin( ), solution.end( ) );
//cout << result << endl;
return result;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
TreeNode* currentPtr;
TreeNode* root = currentPtr;
int index;
if( data == "" )
return NULL;
deserializeHelper( data, currentPtr, 1 );
//cout << root->left->val;
return root;
}
private:
void deserializeHelper( string data, TreeNode* currentPtr, int index )
{
if( index <= data.length( ) )
{
if( data[index - 1] != '$' )
{
currentPtr = new TreeNode( data[index - 1] - '0' );
deserializeHelper( data, currentPtr->left, ( 2 * index ) );
deserializeHelper( data, currentPtr->right, ( 2 * index ) + 1 );
cout << currentPtr->left << " ";
}
}
}
void serializeHelper( vector<char>& solution, TreeNode* currentPtr )
{
queue<TreeNode*> myQueue;
myQueue.push( currentPtr );
while( !myQueue.empty( ) )
{
currentPtr = myQueue.front( );
if( currentPtr != NULL )
{
myQueue.push( currentPtr->left );
myQueue.push( currentPtr->right );
solution.push_back( currentPtr->val + '0' );
}
if( currentPtr == NULL )
solution.push_back( '$' );
myQueue.pop( );
}
}
};
类编解码器{
公众:
//将树编码为单个字符串。
字符串序列化(TreeNode*根){
向量解;
序列化帮助程序(解决方案,根);
字符串结果(solution.begin(),solution.end());
//不正确,(2*指数)+1);
不能左);
myQueue.push(currentPtr->right);
解决方案。向后推(currentPtr->val+'0');
}
如果(currentPtr==NULL)
解决方案。推回(“$”);
myQueue.pop();
}
}
};
中的
currentPtr
用新地址更新<代码>当前PTR是一个指针。它是一个包含另一个变量地址的变量。另一个变量通过引用传递到deserialzeHelper
,因为currentPtr
是指针。对于currentPtr
本身,情况就不同了
currentPtr
是一个新变量,它包含函数调用中使用的指针所存储地址的副本,就像data
是一个新变量,它是第一个参数的副本,index
是最后一个参数的副本一样
由于您希望更新currentPtr
,因此需要对源指针本身的引用
void deserializeHelper( string data, TreeNode* & currentPtr, int index )
我们在这里,可能有优势
void deserializeHelper( const string & data, TreeNode* currentPtr, int index )
要防止复制
数据
。有时编译器会为您这样做,但我不愿意在所有编译器中冒险,尤其是在递归函数中,您可能会制作数百个副本。您应该将std::string
作为const
引用传递。这避免了复制整个结构的需要。不,指针不是通过引用自动传递的,我不知道你为什么会这样认为。如果您没有明确使用&
,您将得到一份副本。非常感谢。
void deserializeHelper( const string & data, TreeNode* currentPtr, int index )