给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
解析:观察树与链表,发现链表的顺序是对树进行前序遍历得到。
因此当树转换为链表时,根节点的右子树是在左子树最后一个元素之后遍历的。
因此对于每一个节点,我们首先寻找其左子树的最后也是最右节点,将节点的右子树接在最后节点的右边。此时所有的子节点都在这个节点的左子树中,之后将左子树转换为右子树,并对每一个节点进行上述操作。
例如:
1
/ \
2 5
/ \ \
3 4 6
-------->
1
/
2
/ \
3 4
\
5
\
6
-------->
1
\
2
/ \
3 4
\
5
\
6
-------->
1
\
2
/
3
\
4
\
5
\
6
-------->
1
\
2
\
3
\
4
\
5
\
6
class Solution {
public:
void flatten(TreeNode* root) {
while(root){
if(!root->left){
root = root->right;
continue;
}
auto l = root->left;
while(l->right) l = l->right;
l->right = root->right;
root->right = root->left;
root->left = nullptr;
root = root->right;
}
}
};