题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
题解
思路1:先序遍历记录结点,然后按照记录的结点调整树的结构。
class Solution {
public:
void flatten(TreeNode* root) {
vector<TreeNode *> list_root;
preorder(root, list_root);
for(int i = 1; i < list_root.size(); i++){
TreeNode *pre = list_root[i - 1], *cur = list_root[i];
pre -> left = nullptr;
pre -> right = cur;
}
}
void preorder(TreeNode* root, vector<TreeNode*>& l){
if(root != nullptr){
l.push_back(root);
preorder(root->left, l);
preorder(root->right, l);
}
}
};
思路2:右子结点 -> 左子结点 -> 父节点顺序的遍历,即反向先序遍历形成链表。
class Solution {
public:
TreeNode* last;
void flatten(TreeNode* root) {
if(root == nullptr) return;
flatten(root->right);
flatten(root->left);
root->right = last;
root->left = nullptr;
last = root;
}
};
大幅降低空间复杂度。
本文介绍了LeetCode中关于将二叉树展开为链表的题目,提供了两种不同的解决方案。思路一通过先序遍历记录节点并重新构建链表;思路二采用反向先序遍历,直接调整树结构,显著降低了空间复杂度。这两种方法都确保了链表顺序与二叉树先序遍历一致。

653

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



