力扣解题小思-8

又来力扣解题了,这里要解决的问题是二叉树相关的,但是之前好像并没有了解过二叉树的知识,二叉树是一种非线性数据结构,每个节点最多有两个子节点,即左节点和右节点,在计算机科学中有广泛应用,例如搜索、排序、数据库索引等领域。所以其实和链表有一定的关系,这里再来看一下相关的题目信息,要完成的是二叉树的中序遍历,中序遍历是什么意思呢,其实就是先遍历左子树,然后访问根结点,之后再遍历右子树。
那应该如何用C语言代码实现呢,这里要先理解一下关于二叉树的构成,其实二叉树也是由节点构成,这个节点和之前用于链表中的节点性质是类似的,下面用一个简单的例子来说明。
typedef struct TreeNode {int data; struct TreeNode *left; struct TreeNode *right;} TreeNode;
这里定义了一个节点,其类型是结构体类型,在结构体中包含数据,以及两个指向这个结构体类型的指针,这和链表的结构体节点比较像,只不过链表中节点的指针用的是next和prev,而这里用的是left和right,性质是一样的,但是含义不同。然后如何对其进行中序遍历呢,这里要用到递归的方法,例如要定义一个遍历函数如下。
void inorderTraversal (TreeNode *root) {
if (root != NULL) {
inoderTraversal (root->left);

inorderTraversal (root->right);
}
}
这里选择了一个没有输出的函数,然后输入的参数是一个指向节点类型的指针,作为根指针来用,而这个根指针也是所有节点的起点。在函数内部,首先是对根节点进行非空判断,如果根是非空则将根节点指向的左节点带入函数,以及将根节点指向的右节点带入函数,当然这里要加入对根节点的操作,例如将根节点的数据进行打印,注意这里打印的内容是在两个函数中间位置的,这里有个隐形条件,就是如果根节点是空则没有任何操作。
然后再来看一下这里题目给出的一些条件,这里依然是给了一个函数,其中函数名字是inorderTraversal,而类型是指向整型变量的指针,而输入参数有两个,一个是根节点,这个和上面的是非常相似,而还有一个是指向整型的指针,那么这个指针又是什么意思呢,其实如果我们对比这个函数和之前的函数就会发现,这里多出来的条件其实是用来定义一个数组的,而这个数组元素的首地址就是需要返回的指针,而大小就是用输入参数决定的,所以可以先定义一个数组。
在尝试的过程当中发现,如果只是用一个函数来完成这道题目的话,又要用到递归的方法,那么就会非常麻烦,所以最后还是采取辅助函数的方法,而辅助函数当中就是真正可以进行递归的函数了,这里先将辅助函数写一下。
void inoder(struct TreeNode* root, int* res, int* index){
if (!root) return;
inorder(root->,res, index);
res[(index)++] = root->val;
inorder(root->right, res, index);
}
这里由于采用的是无返回值的函数,是因为其输出是通过函数参数的形式进行的,而函数参数中有添加的根节点,以及数组元素的地址,以及数组的大小。所以当调用函数,并在函数中对这些参数进行修改之后,这些修改并不会改变,而是会保留。每一次调用这个函数,就说明遍历了二叉树中的一个节点,而通过函数中对数组进行赋值,就可以将二叉树中的数据存入到数组当中,在这个过程中不仅是对数组元素进行了赋值,同时还对数组大小进行了更新,每一次的赋值数组大小都加一,这样的话数组大小也就能得到了,所以说这样的话,就能够得到主函数中需要得到的数据,也即数组指针以及数组的大小。而在主函数中,主要需要解决一个问题,就是如何定义数组,因为在函数中直接定义数组的话,当函数解除调用时,所使用的内存将会清除,所以说需要使用malloc函数的方法进行数组的定义,下面是主函数。
int
inorderTraversal (struct TreeNode* root, int* retrunSize){
int maxNodes = 1000;
int res = (int)malloc(sizeof(int) * maxNodes);
*returnSize = 0;
inorder(root, res, returnSize);
return res;
}

posted @ 2026-04-01 21:06  getacat  阅读(14)  评论(0)    收藏  举报