不要理解有关C++

发布于 2025-02-12 21:18:04 字数 917 浏览 0 评论 0原文

因此,我正在做这个leetcode问题,不了解发生了什么。这是关于通过二进制树的预订遍历。

问题的问题

起初,我认为实现我在中学到的遍历代码非常简单班级。

    vector<int> preorderTraversal(TreeNode* root) {
    vector<int> final;

    if(root == nullptr){
        return final;
    }

    final.push_back(root->val);
    preorderTraversal(root->left);
    preorderTraversal(root->right);

    return final;
}

但是后来,当代码在其中一个测试用例中,我碰到了一个障碍。

我挠头递归地绕过这个问题,直到我查看了发布的一些解决方案。

    vector<int>ar1;
void preOrder(TreeNode *root)
{
    if(root==nullptr)
        return;
    ar1.push_back(root->val);
    preOrder(root->left);
    preOrder(root->right);
}
vector<int> preorderTraversal(TreeNode* root) 
{
    preOrder(root);
    return ar1;
}

我的问题是,是什么使他们的遍历使用与在第一个代码段中进行的方法不同的方法?

So I was doing this leetcode question and didn't understand what was happening. It is about preorder traversal through a binary tree.

Problem in question

At first I thought it would be simple enough to implement the traversal code I learned in class.

    vector<int> preorderTraversal(TreeNode* root) {
    vector<int> final;

    if(root == nullptr){
        return final;
    }

    final.push_back(root->val);
    preorderTraversal(root->left);
    preorderTraversal(root->right);

    return final;
}

but then I hit a snag when the code hit a NULL in the left child of the root in one of the test cases.

I scratched my head at what I could do recursively to bypass this problem until I looked at some of the solutions that were posted.

    vector<int>ar1;
void preOrder(TreeNode *root)
{
    if(root==nullptr)
        return;
    ar1.push_back(root->val);
    preOrder(root->left);
    preOrder(root->right);
}
vector<int> preorderTraversal(TreeNode* root) 
{
    preOrder(root);
    return ar1;
}

My question is what makes their traversals using a different method than doing it in the first code snippet?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

老子叫无熙 2025-02-19 21:18:04

评论代码:

矢量最终;是从返回从未恢复过的函数的局部变量,只是掉入深渊。如果第二个解决方案使用全局变化来捕获它,则两者都很漂亮,我个人通过Treenode通过参考向量,

但是如果您想以自己的方式进行操作,那么您会做这样的事情(不是使用IDE/编译器,可能需要一些修复程序)

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> final;

    if(root == nullptr){
        return final;
    }

    final.push_back(root->val);
    auto leftVec = preorderTraversal(root->left);
    if(!leftVec.isEmpty(){
       final.reserve(final.size() + leftVec.size());
       final.insert(std::end(final), std::begin(leftVec ), std::end(leftVec ));
    }

    auto rightVec = preorderTraversal(root->right);
    if(!rightVec.isEmpty(){
       final.reserve(final.size() + rightVec .size());
       final.insert(std::end(final), std::begin(rightVec ), std::end(rightVec ));
    }

    return final;
}

建议的更改,请看到它的好多了?

另外,如果您知道treenode上有多少个节点,那么如果您不希望代码制作一百万个不必要的副本,则要保留全尺寸。

void preorderTraversal(TreeNode* root, vector<int>& output) {
    if(root == nullptr){
        return;
    }
    
    //Should use emplace back to remove a copy here too
    output.emplace_back(root->val);
    preorderTraversal(root->left, output);
    preorderTraversal(root->right, output);
}

Comment with code:

vector final; is local variable to the function that is never recaptured by the return, just dropped into the abyss. Where the second solution uses a global varaible to capture it, both are pretty jank, I'd personally pass a reference vector with the TreeNode

But if you want to do it your way, you'd do something like this (Not using an IDE/compiler, might need some fix-ups)

vector<int> preorderTraversal(TreeNode* root) {
    vector<int> final;

    if(root == nullptr){
        return final;
    }

    final.push_back(root->val);
    auto leftVec = preorderTraversal(root->left);
    if(!leftVec.isEmpty(){
       final.reserve(final.size() + leftVec.size());
       final.insert(std::end(final), std::begin(leftVec ), std::end(leftVec ));
    }

    auto rightVec = preorderTraversal(root->right);
    if(!rightVec.isEmpty(){
       final.reserve(final.size() + rightVec .size());
       final.insert(std::end(final), std::begin(rightVec ), std::end(rightVec ));
    }

    return final;
}

Where the suggested change is this, see how much nicer it is?

Also if you know how many nodes there are on TreeNode you want to reserve the full size before you do any of this if you don't want your code to make a million unnecessary copies.

void preorderTraversal(TreeNode* root, vector<int>& output) {
    if(root == nullptr){
        return;
    }
    
    //Should use emplace back to remove a copy here too
    output.emplace_back(root->val);
    preorderTraversal(root->left, output);
    preorderTraversal(root->right, output);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文