【问题标题】:Leetcode 297 Serialize and Deserialize Binary TreeLeetcode 297 序列化和反序列化二叉树
【发布时间】:2019-01-26 23:59:43
【问题描述】:

所以我正在做 leetcode 297。由于某种原因,我的反序列化辅助函数的 TreeNode 指针不会通过引用传递。我知道人们说我是多么愚蠢,因为指针是通过引用自动传递的。但是,我只是无法弄清楚为什么在这种情况下它不会通过引用传递。也许这不是问题。请帮我。这是我的代码:

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( );
    }
}
};

【问题讨论】:

  • 您应该将std::string 作为const 引用传递。这避免了复制整个结构的需要。
  • 不,指针不会通过引用自动传递,我不确定您为什么会这样认为。如果您没有明确使用&amp;,您将获得一份副本。

标签: c++ pointers binary-tree


【解决方案1】:

void deserializeHelper( string data, TreeNode* currentPtr, int index )

currentPtr 更新为新地址。 currentPtr 是一个指针。它是一个包含另一个变量地址的变量。另一个变量通过引用传递给deserialzeHelper,因为currentPtr 是一个指针。 currentPtr 本身不能这样说。

currentPtr 是一个新变量,其中包含函数调用中使用的指针存储的地址的副本,就像 data 是一个新变量,它是第一个参数的副本,index 是最后。

由于您希望更新currentPtr,您需要对源指针本身的引用。

void deserializeHelper( string data, TreeNode* & currentPtr, int index )

我们在这里,可能有优势

void deserializeHelper( const string & data, TreeNode* currentPtr, int index )

防止复制data。有时编译器会为您执行此操作,但我不愿意在所有编译器中冒险,尤其是在可能制作数百个副本的递归函数中。

【讨论】:

  • 非常感谢。
猜你喜欢
  • 2021-11-14
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多