c++ - 为什么原始根在主函数中没有改变(扁平二叉树到链表)?

https://leetcode.com/problems/flatten-binary-tree-to-linked-list/

我说的是“扁平化”功能,我知道我可以在不创建另一个名为 help 的功能的情况下做到这一点,但我想以这种方式解决这个问题。帮助功能正确地展平树并在 TreeNode* ans 中正确返回它,但它没有反映在根中,在根中它是从原始打印

using namespace std;

class TreeNode {
public:
    int val;
    TreeNode *left;
    TreeNode *right;

    TreeNode(int val) {
        this->val = val;
        left = right = nullptr;
    }
};

TreeNode *takeInput() {
    int rootData;
    cout << "Enter data of root node" << endl;
    cin >> rootData;
    if (rootData == -1) {
        return nullptr;
    }
    TreeNode *root = new TreeNode(rootData);

    queue<TreeNode *> pendingNodes;
    pendingNodes.push(root);

    while (!pendingNodes.empty()) {
        TreeNode *front = pendingNodes.front();
        pendingNodes.pop();

        int leftNodeData;
        cout << "Enter val of left child of parent " << front->val << endl;
        cin >> leftNodeData;
        if (leftNodeData != -1) {
            front->left = new TreeNode(leftNodeData);
            pendingNodes.push(front->left);
        }

        int RightNodeData;
        cout << "Enter val of Right child of parent " << front->val << endl;
        cin >> RightNodeData;
        if (RightNodeData != -1) {
            front->right = new TreeNode(RightNodeData);
            pendingNodes.push(front->right);
        }
    }
    return root;
}

void print(TreeNode *root) {
    if (root == NULL) {
        return;
    }
    queue<TreeNode *> pendingNodes;
    pendingNodes.push(root);

    while (!pendingNodes.empty()) {
        TreeNode *front = pendingNodes.front();
        pendingNodes.pop();

        cout << front->val << ":";

        if (front->left != nullptr) {
            cout << " L: " << front->left->val;
            pendingNodes.push(front->left);
        }

        if (front->right != nullptr) {
            cout << " R: " << front->right->val;
            pendingNodes.push(front->right);
        }
        cout << endl;
    }
}

TreeNode *help(TreeNode *root) {
    if (root == nullptr) {
        return nullptr;
    }

    TreeNode *leftAns = help(root->left);
    TreeNode *rightAns = help(root->right);
    if (leftAns != nullptr) {
        TreeNode *temp = leftAns;
        while (temp->right != nullptr) {
            temp = temp->right;
        }
        temp->right = root;
        root->left = nullptr;
    }
    root->right = rightAns;
    if (leftAns != nullptr) {
        root = leftAns;
        return leftAns;
    }
    return root;
}

void flatten(TreeNode *root) {
    TreeNode *ans = help(root);
    // help(root);
    // *root = *ans;
    root = ans;

    // root = help(root);
}

int main() {
    TreeNode *root = takeInput();
    print(root);
    flatten(root);
    cout << "ans:" << endl;
    print(root);
    return 0;
}```

回答1

正如 user207421 在他的评论中所说,您当前正在通过 value 将 root 传递给 flatten 函数,这意味着当 root 被分配时,该行中的 ans 的 value

root = ans;

只有 root 的本地副本被更改。如果您通过引用将 root 传递给函数,则根 value 的 value 将被更改,而不仅仅是本地副本。

该功能只需要更改为

void flatten(TreeNode *&root) {
    root = help(root);
}

编辑:

查看了 leet 代码链接后,我现在意识到之前的答案 is invalid for 与挑战中提供的 flatten 函数签名不完全匹配。如果有用,我将保留上面的原始答案。如果你想改变root的value,你应该将answer指向的value分配给指向root的内存位置

void flatten(TreeNode *root) {
    *root = *help(root);
}

相似文章

随机推荐

最新文章