C++结构体中定义函数

在c++中,struct结构体中除了成员变量之外,也可以像类一样,定义成员函数,包括特殊的函数:构造函数和析构函数。

接下来记录一个创建二叉树的例子。

#include <vector>
#include <iostream>
#include <queue>
using namespace std;

//创建树节点的结构体
struct TreeNode{
    int data;
    TreeNode *leftchild;   
    TreeNode *rightchild;
    //该句相当于对该节点进行赋值,如第20行中new TreeNode(vec[i]):新建一个TreeNode节点,自动调用构造函数,使data值为vec[i],且左右孩子均为NULL
    //在c++中,结构体与类一样结构体也可以使用构造函数和析构函数
    //构造函数:函数名称与结构体一样,主要完成初始化工作保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次,无返回值。 
    TreeNode(int x){
        data = x;
        leftchild = NULL;
        rightchild = NULL;
    }
    void TreeNodeprint(const TreeNode* a){
        if (a != NULL){
            cout<<"该节点的数值为:"<<a->data<<endl;
        }
        else{
            cout<<"该节点为空"<<endl;
        }
    }
};

// 根据数组构造二叉树
TreeNode* construct_binary_tree(const vector<int>& vec) { //其实相当于把整型数组转成结构体数组
    vector<TreeNode*> vecTree (vec.size(), NULL);  //创建一个和传入的数组一样长的数组vecTree用于构造二叉树
    TreeNode* root = NULL;  //初始化指向根节点的指针为NULL
    // 把输入数值数组,先转化为二叉树节点数组
    for (int i = 0; i < vec.size(); i++) {
        TreeNode* node = NULL;
        if (vec[i] != -1) node = new TreeNode(vec[i]); // 用 -1 表示null
        vecTree[i] = node;
        if (i == 0) root = node;
        node->TreeNodeprint(node); //调用结构体中TreeNodeprint函数
    }   
    for (int i = 0; i * 2 + 1 < vec.size(); i++) {
        if (vecTree[i] != NULL) {
            vecTree[i]->leftchild = vecTree[i * 2 + 1];  //注意指针的形式,结构体的成员赋值需要使用->符号
            if(i * 2 + 2 < vec.size())
            vecTree[i]->rightchild = vecTree[i * 2 + 2];
        }
    }
    return root;
}

int main() {
    // 用 -1 来表示null
    vector<int> vec = {4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8};
    TreeNode* root = construct_binary_tree(vec);
}

该程序段运行的结果为:

该节点的数值为:4
该节点的数值为:1
该节点的数值为:6
该节点的数值为:0
该节点的数值为:2
该节点的数值为:5
该节点的数值为:7
该节点为空
该节点为空
该节点为空
该节点的数值为:3
该节点为空
该节点为空
该节点为空
该节点的数值为:8
4
1 6
0 2 5 7
-1 -1 -1 3 -1 -1 -1 8
-1 -1 -1 -1
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值