Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python转换为C++;_Python_C++_Tree - Fatal编程技术网

从Python转换为C++;

从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代码: #

已经用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;
    }
};
类解决方案{
公众:
向量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);