结构体参数传递的方法
结构体参数在容器及其适配器传递的方法
在刷二叉树前序迭代遍历的时候,我要用栈存入这样的一个结构体(二叉树的定义):
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) {}
};
我的定义和使用是这样的:
报错的内容是:
大体的意思就是没有找到push函数,不能从TreeNode *转化成TreeNode,原因是我stack的定义和使用不对应:
我们看一下在容器(vector)的使用中,传入地址和其他数据是怎么样的机制。
我前面定义的是一个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()值传递到底啥意思?