要求:给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
(这个题目就是在LeetCode-102基础上添加了要求,基本思路大致相同)
示例
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下::
[
[3],
[20,9],
[15,7]
]
分析一下:这个要求和一般的层次遍历输出就有两点不同,一个是需要按层次输出,再一个就是需要按照 'Z' 形输出,也就是(由上向下)偶数层需要翻转一下。确定了这两个不同之处,问题也就简化了:1.先按照要求层次遍历;2.再翻转一下特殊层。
代码如下:
/**
* 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 depth(struct TreeNode * root){ //确定树深度
if(root==NULL) return 0;
int dl=depth(root->left);
int dr=depth(root->right);
return (dl>dr? dl:dr)+1;
}
void ceng(struct TreeNode *root,int k,int *num){ //确定每层的结点个数
if(root==NULL) return;
num[k]++;
ceng(root->left,k+1,num);
ceng(root->right,k+1,num);
return ;
}
void put(int ** ret,int *num,struct TreeNode *root,int k){ //按照层次遍历的循序放入
if(root==NULL) return;
ret[k][(num[k]++)]=root->val;
put(ret,num,root->left,k+1);
put(ret,num,root->right,k+1);
}
void adjust(int ** ret,int * num ,int h){ //对偶数层进行调整
for(int i=1;i<h;i+=2){
int j=num[i]; //每层对应的结点数
for(int k=0;k<j/2;k++){
int temp=ret[i][k];
ret[i][k]=ret[i][j-k-1];
ret[i][j-k-1]=temp;
}
}
return ;
}
int** zigzagLevelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
int h; h=depth(root); //确定树的深度
int **ret=(int **)malloc(sizeof(int*)*h); //结果指针ret
int *num=(int*)malloc(sizeof(int)*h); //记录每层结点数目
memset(num,0,sizeof(int)*h); //清零
ceng(root,0,num); //确定每层的结点个数
for(int i=0;i<h;i++){
ret[i]=(int *)malloc(sizeof(int)*num[i]); //构造每层的首指针
num[i]=0; // 由于后面给各层结点计数
}
put(ret,num,root,0); //按照层次遍历的循序放入
adjust(ret,num,h); //对偶数层进行调整
* returnColumnSizes=num;
* returnSize=h;
return ret;
}