从Python转换为C++;
已经用Python编写了树的级别顺序遍历代码。试图将相同的工作流转换成C++,但在底部我已经提到了一个错误。需要一些帮助纠正/简化C++中的代码。 样本i/p和o/p:从Python转换为C++;,python,c++,tree,Python,C++,Tree,已经用Python编写了树的级别顺序遍历代码。试图将相同的工作流转换成C++,但在底部我已经提到了一个错误。需要一些帮助纠正/简化C++中的代码。 样本i/p和o/p: Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 工作Python代码: #
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
工作Python代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root:
return []
frontier = [root]
res = [[root.val]]
while frontier:
next = []
for u in frontier:
if u.left: next.append(u.left)
if u.right: next.append(u.right)
frontier = next
res.append([node.val for node in next])
return res[:-1]
有错误的C++代码:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root==NULL) return {};
vector<vector<int>> res;
res.push_back({root->val});
vector<TreeNode*> frontier;
frontier.push_back(root);
while(!frontier.empty()){
vector<TreeNode*> next;
auto u = frontier.begin();
for(; u != frontier.end() ; u++){
if(u->left!=NULL) next.push_back(u->left);
if(u->right!=NULL) next.push_back(u->right);
}
frontier = next;
vector<int> temp;
while(!next.empty()){
temp.push_back(next.back()->val);
next.pop_back();
}
res.push_back(temp);
}
return res;
}
};
类解决方案{
公众:
向量levelOrder(树节点*根){
if(root==NULL)返回{};
向量res;
res.push_back({root->val});
媒介边界;
边界。推回(根);
而(!frontier.empty()){
向量下一步;
auto u=frontier.begin();
对于(;u!=frontier.end();u++){
如果(u->left!=NULL)下一步。向后推(u->left);
如果(u->right!=NULL)下一步。向后推(u->right);
}
前沿=下一个;
向量温度;
而(!next.empty()){
温度向后推(下一步向后推()->val);
下一步,弹回来;
}
res.推回(温度);
}
返回res;
}
};
Error:Char 23:Error:request for member'left'in'*u.\uu gnu\u cxx::\uu normal\u iterator::operator->()',指针类型为'TreeNode*'(可能您打算使用'->'?)
如果你不发布编译过的代码,那么帮助你就困难多了——我自己也不难猜测和编写:
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
但是如果你的代码没有它就无法编译,那么请不要让我自己写/猜测
无论如何,我查看了您的代码,发现:
vector<TreeNode*> frontier;
...
auto u = frontier.begin();
...
if(u->left!=NULL) next.push_back(u->left);
哦,顺便说一下:。相信我说的话;立即养成写那些
std::
的习惯要比在不良行为根深蒂固之后纠正它们容易得多——这是一个艰难的过程。你真的不应该使用普通指针的向量。这使得管理指向的对象的生命周期变得非常困难。我明白了。。对于这种情况,您有什么建议?在这种情况下,std::unique的向量可能是最好的。
vector<TreeNode*> frontier;
...
auto u = frontier.begin();
...
if(u->left!=NULL) next.push_back(u->left);
if ((*u)->left != NULL) next.push_back((*u)->left);