题目
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
1
\
2
\
3
\
4
\
5
\
6
思路
1.递归。递归的一个非常重要的点就是:不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出。对于函数flatten来说:
函数作用:将一个二叉树,原地将它展开为链表
输入:树的根节点
输出:无
2.迭代。把左子树变成右子树, 左子树的最右侧的节点的next指向原右子树
实现
递归实现
/**
* 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) {
if (root == nullptr) {
return;
}
// 先将左子树变为链表
flatten(root->left);
// 再将右子树变为链表
flatten(root->right);
// 暂存右子树
TreeNode* tmp = root->right;
// 左子树接在根节点右边
root->right = root->left;
root->left = nullptr;
// 最后将变成链表的右子树放在变成链表的左子树的最右边
while (root->right != nullptr) {
root = root->right;
}
root->right = tmp;
}
};
迭代实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
原地展开
把所有的左子树变成右子树(这个思路不错)
左子树的最右侧的节点的next指向右子树
*/
class Solution {
public:
void flatten(TreeNode* root) {
while (root != NULL) {
if (root->left != NULL) {
TreeNode* temp = root->left;
while (temp->right != NULL) {
temp = temp->right;
}
temp->right = root->right;
root->right = root->left;
root->left = NULL;
}
root = root->right;
}
}
};
本文详细解析了如何将二叉树原地转换为链表的算法,包括递归和迭代两种实现方式,提供了具体的代码示例,深入探讨了函数作用、输入输出以及实现细节。
914

被折叠的 条评论
为什么被折叠?



