繁体   English   中英

从 Python 转换为 C++

[英]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);

在这里,您的ustd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM