1.题目要求:
c
给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。
例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。
反转后,返回树的根节点。
完美 二叉树需满足:二叉树的所有父节点都有两个子节点,且所有叶子节点都在同一层。
节点的 层数 等于该节点到根节点之间的边数。
2.全部代码:
c
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//创建队列结构体
typedef struct queue{
struct TreeNode* value;
struct queue* next;
}queue_t;
//入队
void push(queue_t** head,struct TreeNode* data){
queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
newnode->value = data;
newnode->next = NULL;
if(*head == NULL){
*head = newnode;
return;
}
queue_t* tail = *head;
while(tail->next != NULL){
tail = tail->next;
}
tail->next = newnode;
}
//出队
struct TreeNode* pop(queue_t** head){
struct TreeNode* x = (*head)->value;
(*head) = (*head)->next;
return x;
}
//逆置函数
void reverse(int* number,int left,int right){
while(left <= right){
int temp = number[left];
number[left] = number[right];
number[right] = temp;
left++;
right--;
}
}
struct TreeNode* reverseOddLevels(struct TreeNode* root) {
queue_t* quence = NULL;
int nextcount = 0;
int count = 1;
int depth = -1;
int* number = (int*)malloc(sizeof(int) * 20000);//层序遍历的数组
int j = 0;
int index = 0;//记录每一层的起点索引
int size = 0;
//开始层序遍历
push(&quence,root);
size++;
while(size != 0){
depth++;
for(int i = 0;i < count;i++){
struct TreeNode* temp = pop(&quence);
number[j] = temp->val;//把层序遍历的节点值存入数组中
j++;
size--;
if(temp->left != NULL){
push(&quence,temp->left);
size++;
nextcount++;
}
if(temp->right != NULL){
push(&quence,temp->right);
size++;
nextcount++;
}
}
//如果高度是偶数,则起点索引加上这一层的结点数,变为下一层的起点索引
if(depth % 2 == 0){
index += count;
}else{
reverse(number,index,j - 1);//如果高度是奇数,则把这一层进行逆置
index += count;
}
//把下一层的结点数赋给count;
count = nextcount;
nextcount = 0;
}
size = 0;
int i = 0;
push(&quence,root);
size++;
//再进行一次层序遍历,把数组的值反过来,赋给树中的结点
while(size != 0){
struct TreeNode* temp = pop(&quence);
size--;
temp->val = number[i];
i++;
if(temp->left != NULL){
push(&quence,temp->left);
size++;
}
if(temp->right != NULL){
push(&quence,temp->right);
size++;
}
}
return root;
}
全部步骤都标在代码中,大家如果觉得好的话,不妨给个免费的赞吧,谢谢了^ _ ^