给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
本题我的思路是通过先序遍历将所有节点存入数组中,然后再构造链表,代码如下:
class Solution {
public:
vector<TreeNode*> nodes;
void traveral(TreeNode* cur) {
if(cur == nullptr) return;
nodes.push_back(cur);
traveral(cur->left);
traveral(cur->right);
}
void flatten(TreeNode* root) {
if(!root) return;
traveral(root);
for(int i = 0; i < nodes.size() - 1; i++) {
TreeNode* pre = nodes[i], *cur = nodes[i + 1];
pre->left = nullptr;
pre->right = cur;
}
return;
}
};
但可以通过后序遍历,反向构建链表,代码如下:
class Solution {
public:
TreeNode* pre;
void flatten(TreeNode* root) {
if(root == nullptr) return;
flatten(root->right);
flatten(root->left);
root->left = nullptr;
root->right = pre;
pre = root;
}
};