[英]Convert from Python to C++
在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 代码:
# 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;
}
};
Error: Char 23: error: request for member 'left' in '* u.__gnu_cxx::__normal_iterator<TreeNode**, std::vector<TreeNode*> >::operator->()', which is of pointer type 'TreeNode*' (maybe you meant to use '->' ?)
当您不发布可编译的代码时,您将很难为您提供帮助-不难猜测并编写我自己的代码:
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
但是如果你的代码没有它就无法编译,那么请不要让我自己写/猜。
无论如何,我查看了您的代码并发现了这一点:
vector<TreeNode*> frontier;
...
auto u = frontier.begin();
...
if(u->left!=NULL) next.push_back(u->left);
在这里,您的u
是std::vector<TreeNode*>::iterator
而不是TreeNode*
,因此您不能只从中获取TreeNode
成员。 您需要取消引用迭代器以获取它包含的 object ( *u
),然后将其用作TreeNode*
。 但是由于运算符优先级,您必须这样做:
if ((*u)->left != NULL) next.push_back((*u)->left);
哦,顺便说一句: 为什么“使用命名空间标准;” 被认为是不好的做法? . 当我说的时候相信我; 养成立即编写这些std::
的习惯,比在根深蒂固后尝试纠正不良行为要容易得多- 以艰难的方式学会了这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.