结构体参数传递的方法

结构体参数在容器及其适配器传递的方法

在刷二叉树前序迭代遍历的时候,我要用栈存入这样的一个结构体(二叉树的定义):

struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode() : val(0), left(nullptr), right(nullptr) {}
      TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
      TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 };

我的定义和使用是这样的:
img
报错的内容是:img
大体的意思就是没有找到push函数,不能从TreeNode *转化成TreeNode,原因是我stack的定义和使用不对应:
我们看一下在容器(vector)的使用中,传入地址和其他数据是怎么样的机制。
img
我前面定义的是一个TreeNode的栈,那就是说,栈中存入的是一个个二叉树的节点,那么当我push的时候,我应该push的是节点的结构体,但是在上面的代码当中,我push的是结构体指针,是一个地址,导致传入参数不对。那到底能不能传入结构体呢?传入怎么使用?
正确的使用如下:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode> st;
        vector<int> result;
        if (root == nullptr) return result;
        st.push(*root);//取地址的内容
        while (!st.empty()) {
            TreeNode t1 = st.top();
            st.pop();
            result.push_back(t1.val);
            if (t1.right) st.push(*(t1.right));
            if (t1.left) st.push(*(t1.left));
        }
        return result;

    }
};

或者
我们定义栈存入的就是结构体的地址,使用结构体指针进行操作:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();                       // 中
            st.pop();
            result.push_back(node->val);
            if (node->right) st.push(node->right);           // 右(空节点不入栈)
            if (node->left) st.push(node->left);             // 左(空节点不入栈)
        }
        return result;
    }
};

解决了这个问题的同时,也可以看到,当访问结构体其中的元素的时候,当函数传入参数定义的是结构体指针的话,函数中使用相同的定义能方便操作。
参考:代码随想录vector push_back()值传递到底啥意思?

posted @ 2023-02-07 23:02  jiumaohappyboy  阅读(50)  评论(0编辑  收藏  举报