题目:给定一个一个二叉树的根结点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就是完成这部分的内容代码函数。
整体代码: