114.二叉树展开为链表
题目描述
给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
题目理解
首先对二叉树进行先序遍历,将遍历得到的节点保存到数组中,之后再根据数组保存的顺序将二叉树展开为链表。
错误示范
class Solution {
private:
vector<TreeNode*> preorder;
public:
void flatten(TreeNode* root) {
traverse(root);
for(int i = 0; i < preorder.size()-1; i++){
TreeNode *curr = preorder.at(i), *next = preorder.at(i+1);
prev->left = nullptr;
prev->right = curr;
}
}
void traverse(TreeNode* root){
if(root == nullptr){
return;
}
preorder.push_back(root);
traverse(root->left);
traverse(root->right);
}
};
错误原因
没有正确理解c++中vector.size()
的返回值,size()
函数返回的是一个无符号整数,如果这个数组为空,那么vector.size()-1
的数值不为-1,而是18446744073709551615(取决于机器字长)
正确代码
class Solution {
private:
vector<TreeNode*> preorder;
public:
void flatten(TreeNode* root) {
traverse(root);
int n = preorder.size();
for(int i = 0; i < n-1; i++){
TreeNode *curr = preorder.at(i), *next = preorder.at(i+1);
prev->left = nullptr;
prev->right = curr;
}
}
void traverse(TreeNode* root){
if(root == nullptr){
return;
}
preorder.push_back(root);
traverse(root->left);
traverse(root->right);
}
};