给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
一、思路
为了将一颗二叉树展开,需要:
- 交换左右孩子
- 展开该二叉树的左子树
- 展开该二叉树的右子树
- 将展开后的左子树接到右子树的叶节点上
C++代码:
class Solution {
public:
void flatten(TreeNode* root) {
if (!root)
return;
flatten(root->left);
flatten(root->right);
// 交换左右子树
TreeNode* left = root->left;
TreeNode* right = root->right;
root->left = right;
root->right = left;
// 将左子树放置于右子树的叶节点
TreeNode* p = root;
while (p->right != NULL)
p = p->right;
p->right = root->left;
root->left = NULL;
return;
}
};