QUESTION
medium
题目描述
给定一个二叉树,原地将它展开为链表
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
说明
原地即 O(1)
的空间复杂度
SOLUTION
其实并不难,但我有点懵,然后看了Leetcode的评论,真的手贱
方法一
递归方法
- 对于某节点,先递归处理左右子树
- 处理完成后,左右子树(如果不为空)应该都变成了规范的链表,然后将右子树接在左子树链表尾部,再把左右子树交换,并设左子树为空
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
flatten(root->left);
flatten(root->right);
if(root->left){
TreeNode* tmp = root->left;
while(tmp->right){
tmp = tmp->right;
}
tmp->right = root->right;
root->right = root->left;
root->left = NULL;
}
}
};
方法二
再仔细研究一下,你应该可以发现有这种操作:
- 用一个
curr
记录当前节点 - 于
curr
节点,把右子树接在左孩子的最右后代上 - 然后交换
curr
左右子树,设其左孩子为空 curr = curr->right
class Solution {
public:
void flatten(TreeNode* root) {
if(!root) return;
TreeNode* curr = root;
while(curr){
if(curr->left){
TreeNode* p = curr->left;
while(p->right) p = p->right;
p->right = curr->right;
curr->right = curr->left;
curr->left = NULL;
}
curr = curr->right;
}
}
};