题目
给你二叉树的根结点 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;
}
};
大幅降低空间复杂度。