目录

1.前序遍历
对于这道题我们可以使用前序遍历来保存每一个节点并将其连接起来
cpp
class Solution {
public:
void flatten(TreeNode* root)
{
vector<TreeNode*> ret;
prevorder(root, ret);
int n = ret.size();
for(int i = 1; i < n; i++)
{
TreeNode* prev = ret[i - 1], *cur = ret[i];
prev->left = nullptr;
prev->right = cur;
}
}
void prevorder(TreeNode* root, vector<TreeNode*>& ret)
{
if(root == nullptr)
return;
ret.push_back(root);
prevorder(root->left, ret);
prevorder(root->right, ret);
}
};
2.前驱节点
cpp
class Solution {
public:
void flatten(TreeNode* root) {
while(root != nullptr)
{
if(root->left != nullptr)
{
TreeNode* prev = root->left;
while(prev->right != nullptr)
prev = prev->right;
prev->right = root->right;
root->right = root->left;
root->left = nullptr;
}
root = root->right;
}
}
};