🔗 https://leetcode.cn/problems/flatten-binary-tree-to-linked-list
题目
- 将二叉树,转换为一个仅有 right 的单链表,left 都为 nullptr
- 单链表的的顺序,是二叉树的先序遍历顺序
思路
- 递归二叉树 node 展开成单链表后的最后一个节点
- 如果该节点无孩子,则是当前节点转化为单链表的最后一个 node
- 若该节点 node 有 right,递归拿到 left 孩子 flat 之后的最后一个 last_node,修改当前节点 node 和 last_node 的指针
- node 已无 right,若有 left,则把 left 展开,修改当前节点
代码
/**
* 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:
TreeNode* find_last(TreeNode* node) {
if (node->left == nullptr && node->right == nullptr) return node;
TreeNode* last_node;
while (node->right) {
last_node = node;
if (node->left) {
last_node = find_last(node->left);
last_node->right = node->right;
node->right = node->left;
node->left = nullptr;
}
node = last_node->right;
}
if (node->left) {
last_node = find_last(node->left);
node->right = node->left;
node->left = nullptr;
return last_node;
}
return node;
}
void flatten(TreeNode* root) {
if (root == nullptr) return;
find_last(root);
}
};