完整代码:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;//结点的int型值存储到val中
struct TreeNode *left;//该结点指向左孩子的指针
struct TreeNode *right;//该结点指向右孩子的指针
};
// 创建二叉树的函数
struct TreeNode *createTreeNode(int val) {
struct TreeNode *newNode = (struct TreeNode *)malloc(sizeof(struct TreeNode));//动态创建一个新结点
newNode->val = val;//给新结点的val成员赋值为传入参数val
newNode->left = NULL;//将该结点的左子树置为NULL,意为没有左子树
newNode->right = NULL;//将该结点的左子树置为NULL意为没有又子树
return newNode;//返回创建好的新结点的指针
}
// 手动构建二叉树的函数
struct TreeNode *buildTree() {
int val;
scanf("%d", &val);//手动输入要赋予的值
if (val == -1) // -1 表示空节点
return NULL;
struct TreeNode *root = createTreeNode(val);//将键盘输入的int值创建为二叉树结点(有值,有左右孩子的指针)
// 递归构建左子树和右子树
root->left = buildTree();//递归的构建左子树
root->right = buildTree();//递归的构建右子树
return root;//递归结束,返回本结点
}
//该函数数,用于进行中序遍历。
//其中的参数root表示当前结点的指针;res表示存储中序遍历结果的数组
//resSize记录结果数组的大小
void inorder(struct TreeNode *root, int *res, int *resSize) {
if (!root)//检查当前子树根结点是否为空。若为空结束递归调用。或者说
return;//表示已经递归到叶子结点的左(或右)子结点,直接返回。
inorder(root->left, res, resSize);//遍历当前结点的左子树
res[(*resSize)++] = root->val;//将当前结点的值赋给保存结果的res数组,并让保存结果数组大小的resSize自增1.
inorder(root->right, res, resSize);//遍历当前结点的右子树
}
//该函数为中序遍历的总接口调用函数。参数root表示指向二叉树根节点的指针,returnSize表示用于存储数组结果大小的指针。函数通过修改returnSize的值来记录结果数组的大小
int *inorderTraversal(struct TreeNode *root, int *returnSize) {
int *res = (int *)malloc(sizeof(int) * 501);//初始化一个大小为501个int大小的数据的数组res,用于存储中序变量的结果
*returnSize = 0;//初始化中序遍历数组(即结果数组)的大小为0.
inorder(root, res, returnSize);//调用中序遍历函数,对当前结点root进行中序遍历
return res;//返回中序遍历结果数组
}
int main() {
printf("请输入二叉树的节点值(-1 表示空节点):\n");
struct TreeNode *root = buildTree(); // 根据键盘输入的值构建二叉树
int returnSize;//returnSize为结果数组的大小
int *result = inorderTraversal(root, &returnSize);//调用中序遍历的函数,将中序遍历的结果数组res赋值给result数组
printf("中序遍历结果为:[");
for (int i = 0; i < returnSize; i++) {//returnSize是表示中序遍历结果数组大小的指针变量
printf("%d", result[i]);//遍历result数组输出它的值
if (i != returnSize - 1) {//两个数之间用逗号隔开
printf(", ");
}
}
printf("]\n");
free(result); // 释放动态分配的内存
return 0;
}
运行截图: