用C语言实现:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值
时间: 2023-10-20 17:48:56 浏览: 66
您好!要实现从二叉树右侧看到的节点值,可以使用二叉树的层次遍历算法,并每一层只取最右侧的节点。以下是用C语言实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树的结点结构
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 定义队列元素结点结构
struct QueueNode {
struct TreeNode *node;
struct QueueNode *next;
};
// 定义队列结构
struct Queue {
struct QueueNode *front;
struct QueueNode *rear;
};
// 初始化队列
void initQueue(struct Queue **queue) {
*queue = (struct Queue *)malloc(sizeof(struct Queue));
(*queue)->front = NULL;
(*queue)->rear = NULL;
}
// 判断队列是否为空
int isQueueEmpty(struct Queue *queue) {
return queue->front == NULL;
}
// 入队
void enqueue(struct Queue *queue, struct TreeNode *node) {
struct QueueNode *newNode = (struct QueueNode *)malloc(sizeof(struct QueueNode));
newNode->node = node;
newNode->next = NULL;
if (isQueueEmpty(queue)) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
// 出队
struct TreeNode* dequeue(struct Queue *queue) {
if (isQueueEmpty(queue)) {
return NULL;
}
struct QueueNode *temp = queue->front;
struct TreeNode *node = temp->node;
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(temp);
return node;
}
// 从右侧观察二叉树节点的值
int* rightSideView(struct TreeNode* root, int* returnSize) {
if (root == NULL) {
*returnSize = 0;
return NULL;
}
// 初始化队列
struct Queue *queue;
initQueue(&queue);
// 存储从右侧看到的节点值
int *result = (int *)malloc(sizeof(int));
int currentIndex = -1;
// 将根节点入队
enqueue(queue, root);
while (!isQueueEmpty(queue)) {
int levelSize = queue->rear - queue->front + 1;
// 遍历当前层级的节点
for (int i = 0; i < levelSize; i++) {
struct TreeNode *currentNode = dequeue(queue);
// 更新当前层级最右侧的节点值
if (i == levelSize - 1) {
currentIndex++;
result = (int *)realloc(result, (currentIndex + 1) * sizeof(int));
result[currentIndex] = currentNode->val;
}
// 将下一层级的节点入队
if (currentNode->left != NULL) {
enqueue(queue, currentNode->left);
}
if (currentNode->right != NULL) {
enqueue(queue, currentNode->right);
}
}
}
// 更新返回的数组长度
*returnSize = currentIndex + 1;
return result;
}
// 创建二叉树节点
struct TreeNode* createNode(int val) {
struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
int main() {
// 创建一个示例二叉树
struct TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->right = createNode(5);
root->right->right = createNode(4);
// 获取从右侧看到的节点值
int size;
int *result = rightSideView(root, &size);
// 打印结果
printf("从右侧看到的节点值:");
for (int i = 0; i < size; i++) {
printf("%d ", result[i]);
}
free(result);
return 0;
}
```
以上是一个用C语言实现的示例代码,可以通过层次遍历获取从二叉树右侧看到的节点值。您可以根据自己的需求进行修改和使用。希望对您有帮助!如有任何疑问,请随时追问。
阅读全文