在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