二叉树的前序遍历

一:题目

解释:

1:

题目的要求就是我们return 一个数组,该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序

比如:示例1的树,前序遍历的顺序应该是1 2 3,那么return 的数组里面的元素及其顺序就是1 2 3

2:

红框里的 returnSize是一个int * 类型的,是一个被传过来的整形指针,它的作用就是我们要将其赋为数组的元素个数,也就是 *returnSize = 元素个数,因为传过来的是int* ,我们才能真正的改变其本身。

returnSize并不是让我们将其当做一个变量来使用,因为变量我们可以自己创建,并不需要这么麻烦的当做参数传给我们。

3:

因为C语言不支持返回数组和数组的大小两个变量,所以通常会通过一个额外的参数来传递数组的大小。

二:代码

根据前文,可知:

1:我们要得到数组的元素个数

2:我们要把前序遍历的元素及其顺序放进数组中

3:最后返回这个数组,且将returnSize赋成元素的个数

解释:

第一个函数 (int TreeSize(struct TreeNode* root)

1:

int TreeSize(struct TreeNode* root)

  • 这是一个函数定义,名为TreeSize,它接收一个指向二叉树节点的指针root作为参数。
  • 函数返回一个整数,这个整数代表了以root为根的整棵二叉树中的节点数量。

2:

return root==NULL? 0:TreeSize(root->left)+TreeSize(root->right)+1;

  • 这是函数的返回语句,使用了条件运算符(也称为三元运算符)。
  • root==NULL:检查传入的节点是否为空(即检查树是否为空或者是否到达了叶节点的子节点)。
  • 如果rootNULL(意味着当前子树为空),则返回0,因为空树没有节点。
  • 如果root不为NULL,则递归计算左子树和右子树的节点数量,并将它们相加,然后加上当前节点(root),因此是TreeSize(root->left) + TreeSize(root->right) + 1

3:

递归的工作原理如下:

  • 递归的基本情况(停止条件):当递归到叶子节点的子节点时(即遇到NULL),返回0
  • 递归的递推情况:对于非空的树,函数递归地计算左子树和右子树的大小,将这两个值相加,并加上当前节点(root)本身。

递归最终会遍历二叉树中的每一个节点,并将它们全部计数一次。

4:

一种错的书写方式:

原因:表达式能用在三目中,而语句不能。return 0 这是一个语句,而0是一个表达式。

第二个函数(void preorder(struct TreeNode* root,int * arr,int* pi))

代码解释:

  • void preorder(struct TreeNode* root, int * arr, int* pi)

    • 定义了一个名为preorder的函数,它接收三个参数:
      • struct TreeNode* root:当前遍历到的二叉树节点的指针。
      • int * arr:一个整数数组的指针,用于存储遍历的结果。
      • int* pi:一个整数指针,用于跟踪当前应该将节点值放入数组的哪个位置。
  • if(root==NULL) return;

    • 这是递归的基本情况(停止条件)。如果当前节点是NULL(即到达了叶子节点的子节点),则直接返回,不执行任何操作。
  • arr[(*pi)++] = root->val;

    • 将当前节点root的值root->val存储到数组arr的第(*pi)个位置,并将pi指向的索引值自增1。这里的(*pi)++是一个后缀自增运算符,它首先返回*pi的值,然后将*pi的值加1。
  • preorder(root->left, arr, pi);

    • 递归调用preorder函数来遍历当前节点的左子树。
  • preorder(root->right, arr, pi);

    • 递归调用preorder函数来遍历当前节点的右子树。

Q:j是用来控制下标的,那为什么穿的不是j,而是&j?

A:

可知:

在第9步之前pi都是3,但是第9步之后,他回到了上一层函数,这层函数里面的pi是1++之后的2,所以pi被改变了,指向了错误的位置,如果后面还有新的节点要存进数组,3这个值就会被覆盖,而&j就避免了这种错误,不管在哪一层,他的值都是被全局改变了

第三个函数:preorderTraversal

就是结合前两个函数,用第一个函数的返回值得到n,n就能malloc一个刚刚好大小的数组,然后再传给preorder 函数将数组按照前序遍历装满,最后将n给returnSize,最后return arr数组。

关于前中后序遍历不了解的同学:递归实现 前/中/后序 遍历二叉树 的详细讲解-CSDN博客

中序:

后序:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值