题目
思路一 先序遍历同时展开
迭代法遍历,先把根节点放入栈中,取出栈顶元素,放入右指针和左指针,再把当前节点添加进遍历的上一节点prev的右指针。
代码一
class Solution {
public:
void flatten(TreeNode* root) {
stack<TreeNode*> s;
if(root) s.push(root);
TreeNode* prev = nullptr;
while(!s.empty()){
auto cur = s.top();
s.pop();
if(cur -> right) s.push(cur -> right);
if(cur -> left) s.push(cur -> left);
if(prev){
prev -> left = nullptr;
prev -> right = cur;
}
prev = cur;
}
}
};
思路二 寻找前驱节点
如果当前节点左子树不为空,就找到当前节点左子树的最右节点(前驱节点),将该最右节点的右指针指向当前节点的右指针,将当前节点的右指针指向它的左子树,左指针置空。将当前节点右移到它的右指针,继续循环。
代码二
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode* cur = root;
while(cur){
if(cur -> left){
TreeNode* pre = cur -> left;
while(pre -> right)
pre = pre -> right;
pre -> right = cur -> right;
cur -> right = cur -> left;
cur -> left = nullptr;
}
cur = cur -> right;
}
}
};