首页 > 其他分享 >结构体参数传递的方法

结构体参数传递的方法

时间:2023-02-07 23:11:44浏览次数:59  
标签:right TreeNode st 参数传递 result push left 方法 结构

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

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

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()值传递到底啥意思?

标签:right,TreeNode,st,参数传递,result,push,left,方法,结构
From: https://www.cnblogs.com/zhaowenrui-life/p/17100124.html

相关文章

  • repeat方法重复 ES6 2302027
    repeat方法让字符串重复......
  • 物联网中利用OTA进行远程升级的详细操作方法
    物联网设备OTA软件升级之:升级包下载过程之旅第一:OTA概述大家好,我是一个软件升级包。这几天呢,我将会进行一次神奇的网络之旅,从开发者的电脑中,一直跑到终端嵌入式设备中。大家......
  • 28-回顾方法的调用
    packagecom.oop;publicclassDemo01{//静态方法static//非静态方法publicstaticvoidmain(String[]args){Student.say();//类名.方法......
  • 硬件控制方法——11.1应用和硬件无关?
    在用C语言等高级编程语言开发的Windows应用中,大家很少能接触到直接控制硬件的指令。这是因为硬件的控制是由Windows全权负责的。不过,Windows提供了通过应用来间接控......
  • 10.11循环处理的实现方法
    接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器“连续进行10次......
  • 10.12条件分支的实现方法
    下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是cmmp指令和跳转指令,这一点估计大家也预料到了。没错,条件分支就是利用这......
  • java-Stream流的常用方法
    一 常见创建流的三种方式//list集合创建流方式newArrayList<>().stream();newHashSet<>().stream();//map集合创建流方式,原......
  • AQS 类中的属性以及方法说明
    AQS类中的属性以及方法说明相关属性 /***等待队列头部(该节点不存储线程,只做指向功能,指向队列中第一个等待节点)*/privatetransientvolatileNodeh......
  • 三种方法用Fortran求逆矩阵
    三种方法用Fortran求四阶矩阵的逆矩阵数值计算Crefertohttps://fortranwiki.org/fortran/show/Matrix+inversionSUBROUTINEMATINV(A,B)DIMENSION......
  • java控制结构1之if else和嵌套分支
    1.程序流程控制介绍在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。1)顺序控制2)分支控制3)循环控制2.顺序结构2.1不做......