1.题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
2.思路分析
递归
- 用前序遍历的方式,将节点全部保存在一个vector中
- 将节点的左孩子置为nullptr,右孩子就是下一个节点
迭代
- 迭代用栈来实现
- 将左子树全部入栈,直到左子树为空
- 然后出栈保存栈顶的右子树
- 继续将其左子树保存在栈中,直到栈空
3.代码展示
/**
* 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) {
vector<TreeNode*> l;
preorder(root, l);
for(int i = 1; i < (int)l.size(); ++i)
{
TreeNode* prev = l[i-1], *cur = l[i];
prev->left = nullptr;
prev->right = cur;
}
}
void preorder(TreeNode* root, vector<TreeNode*>& l)
{
if(root != nullptr)
{
l.push_back(root);
preorder(root->left, l);
preorder(root->right, l);
}
}
};