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