这题用前序遍历的话,递归应该不难,但是官解给出了一个找父节点的方法,空间消耗是O(1),这里做个记录。
原题传送门
【题目描述】
【示例】
【解题过程】
代码是在官解上加了点自己的注释,思路也是自己根据代码分析的, 官解链接
【思路】
- 将原来的右子树与左子树的最右边节点连接
- 将左子树插入到右子树的地方
- 考虑新的右子树的根节点,一直重复直到新的右子树为 null
【代码】
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode *curr = root;
while (curr != nullptr) {//一致扫描到末尾
if (curr->left != nullptr) {//如果左儿子不为空
auto next = curr->left;
auto predecessor = next;
while (predecessor->right != nullptr) {//扫描到左子树的最右边的叶子节点
predecessor = predecessor->right;
}
predecessor->right = curr->right;//将当前节点的右子树拼过来
curr->left = nullptr;//令左子树为空
curr->right = next;//令右儿子为之前的左儿子
}
curr = curr->right;//继续扫描
}
}
};