【问题标题】:why did we used *preorderIdx instead of preorderIdx?为什么我们使用 *preorderIdx 而不是 preorderIdx?
【发布时间】:2021-06-22 20:42:32
【问题描述】:

因此,在这个问题中,我们应该从给定的预序序列构造一个 BST。 preorder[] 是大小为n 的数组,preorderIdx 表示从0开始的索引。

constructBST()函数中,为什么我们将preorderIdx的参数作为指针传递?在函数内部,为什么我们使用*preorderIdx 而不是preorderIdx?在root->leftroot->right 中调用constructBST() 函数时,为什么我们不使用*preorderIdx?谁能给我解释一下?

#include<bits/stdc++.h>
using namespace std;

struct Node{
    int data;
    struct Node* left;
    struct Node* right;
    Node(int val){
        data = val;
        left = NULL;
        right = NULL;
    }
};


Node * constructBST(int preorder[], int*preorderIdx, int key, int min, int max, int n){
    if(*preorderIdx>=n){
        return NULL;
    }
    
    Node* root = NULL;
    if(key> min && key<max){
        root = new Node(key);
        *preorderIdx = *preorderIdx +1;
        if(*preorderIdx<n){
            root->left = constructBST(preorder,preorderIdx,preorder[*preorderIdx],min,key,n);
        }
        if(*preorderIdx<n){
            root->right = constructBST(preorder,preorderIdx,preorder[*preorderIdx],key,max,n);
        }
    }
    
    return root;
}


void inorder(Node* root){
    if(root==NULL){
        return;
    }
    inorder(root->left);
    cout<< root->data<<" ";
    inorder(root->right);
}

void printPreorder(Node* root){
    if(root==NULL){
        return;
    }
    cout<< root->data<<" ";
    printPreorder(root->left);
    
    printPreorder(root->right);
}


int main(){
    
    int preorder[]={10,2,1,13,11};
    int n =5;
    int preorderIdx =0;
    Node * root = constructBST(preorder,preorderIdx,preorder[0],INT_MIN,INT_MAX,n);
    printPreorder(root);
    
}

【问题讨论】:

  • 显示的代码将无法编译,因为main() 试图调用constructBST(),将int 传递给预期int*constructBST(...,preorderIdx,...) 需要改为 constructBST(...,&amp;preorderIdx,...)
  • 将指针传递给变量在 C 中常用来模拟按引用传递。您可能想投资some good C++ books 以正确学习 C++,而不是使用所谓的“竞争”网站。此类网站上使用的代码通常从糟糕到非常糟糕(那种糟糕到会让代码的作者几乎失业)。
  • 是的,我忘了添加 &
  • 你使用的是什么参考,告诉你使用&lt;bits/stdc++&gt;。这不是标准的。你应该得到一个不同的参考。

标签: c++ pointers binary-search-tree


【解决方案1】:

这些都是很好的问题!

为什么我们将 preorderIdx 的参数作为指针传递?

因为constructBST 修改 preorderIdx (*preorderIdx = *preorderIdx +1;) 并且它希望这些更改对调用者可见。

在函数内部我们使用 *preorderIdx 而不是 preorderIdx 为什么?

仅仅因为它是一个指针。该函数声明为int *preorderIdx,因此要访问int,我们编写*preorderIdx

root-&gt;leftroot-&gt;right 中调用constructBST() 函数时,为什么我们不使用*preorderIdx

因为我们将相同的指针传递给递归调用。我们没有传递指向不同整数的指针。

【讨论】:

  • 好的,到现在为止。但是,那为什么我们在 roo->left 和 roo->right 中使用 preorder[*preorderIdx] 呢?
  • 在这两行中为什么我们不能使用 preorder[preorderIdx] 而不是 preorder[*preorderIdx] ?
  • @AnonymousUser 因为preorderIdx 是指向索引的指针,而不是索引本身?你肯定需要读一些好书或参加一些课程。应该涵盖所有这些内容。
  • @Someprogrammerdude 我真的被指针困住了。这就是为什么 python 比 c++ 容易的原因。但我真的需要学习指针。那么,你能告诉我一些好的指针资源吗?也许一些 youtube 视频。因为我自己有点难以理解。
猜你喜欢
  • 1970-01-01
  • 2013-02-18
  • 2012-02-21
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2018-10-21
  • 2020-07-11
相关资源
最近更新 更多