leetcode--二叉树的锯齿形层次遍历(C语言)

题目:给定一个一个二叉树的根结点root,返回其节点值的锯齿形层次遍历。

锯齿形遍历:先从左到右遍历,再从右到左进行下一层的遍历,往后的都是以此类推。

案例:

 

输入:[1,2,3,4,5,6,null,null,null,7]

输出:[[1],[3,2],[4,5,6],[7]];

需要完成的程序:

/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     struct TreeNode *left;

 *     struct TreeNode *right;

 * };

 */

/**

 * Return an array of arrays of size *returnSize.

 * The sizes of the arrays are returned as *returnColumnSizes array.

 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().

 */

int** zigzagLevelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){

}

 

解答:

本体就是要求完成层次遍历,只不过类型不一样,先带大家走一遍常规的层次遍历。

层次遍历原理:从其名称就可以理解到是一层一层的遍历,先遍历完第一层再遍历下一层,一次下去。

需要借助队列进行解答:

首先就是要先申请一个队列空间,front是输入指针,rear是输出指针

 遍历第一层:

遍历第二层,同时将上一层输出:

 遍历第三层并将上层输出:

以此类推,直到全部遍历完。

再来看锯齿形的层次遍历,它的主要中心思想是怎么实现锯齿遍历,相信有些同学以及想到了方法。奇数层从左到右遍历,偶数层从右向左遍历即可。其中我是假设根结点是第一层。

或许很多同学会遇到一个瓶颈问题。该问题我以图片来展示:

遍历第二层之后,第三层是需要从左到右遍历, 而输出第二层是先输出结点3,然后在将结点3的左右孩子按照从左到右遍历输入队列。然后再输出结点2,将结点2的 左右孩子按照从左到右遍历输入队列。得到的队列是这样的:

第三层输出的顺序为:6->4->5,而正确的顺序应该是4->5->6。如何解决这个问题呢。

 注意:在奇数层输入的时候,一定是最右边的孩子按照顺序从右向左先进入队列。

如果是偶数层输入的时候,一定是最左边的孩子按照顺序从左向右先进入队列。

 这句话的具体含义:

比如第二层的输入,应该是在第一层的最右边孩子结点先按照层数规律来输入(从右向左),先输入3在输入2.

输入第三层时,是在第二层的最左边孩子结点(即为结点2)先按照层数规律来输入(从左到右)

先输入4到5,最后到结点6.

其中第一层的最右边孩子结点是front指针指向的,第二层最左边孩子结点也是front指针指向的,所以借助一个临时指针,让其从front指针倒着后退指向。下面真题代码中函数Pop1就是完成这部分的内容代码函数。

 整体代码:

 

锯齿形层次遍历是一种二叉树层次遍历方法,它会按照"之"字形的顺序遍历二叉树的节点。具体实现可以使用队列或者递归的方式来实现使用队列的方法可以按照层次遍历的思路来实现,首先将根节点加入队列中,然后依次取出队列中的节点。在每一层遍历时,我们可以使用一个临时列表来存储当前层的节点值,并将下一层的节点按照遍历顺序添加到新的队列中。同时,我们可以使用一个变量来记录当前层的层数,如果层数为偶数,则按照顺序添加到临时列表中;如果层数为奇数,则按照逆序添加到临时列表中。最后将临时列表添加到最终结果中。这样就能实现二叉树锯齿形层次遍历。 另一种实现方式是使用递归来进行遍历。我们可以使用一个辅助函数来实现递归遍历。在遍历过程中,我们可以传递当前节点和当前层的层数作为参数,并根据层数的奇偶性来决定节点值的添加位置。同时,我们可以使用一个列表来存储每一层的节点值,并在递归的最后将列表转换为最终的结果。这样也能实现二叉树锯齿形层次遍历。 综上所述,二叉树锯齿形层次遍历可以使用队列或递归来实现,具体取决于个人的喜好和代码风格。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [二叉树锯齿形层序遍历[分层遍历方式之一 -> 前序遍历+level]](https://blog.csdn.net/qq_43164662/article/details/125512062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【LeetCode】103. 二叉树锯齿形层次遍历](https://blog.csdn.net/weixin_41888257/article/details/107284460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值