二叉树自下而上,从右到左的层次遍历算法可以使用广度优先搜索(BFS)算法实现。BFS算法通常使用队列来辅助实现,但在这种情况下,我们需要将每一层的节点按照从右到左的顺序插入到结果列表中,因此可以使用栈来辅助实现。

下面是C语言代码实现:

#include <stdio.h>
#include <stdlib.h>

#define MAX_QUEUE_SIZE 100

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

struct Queue {
    struct TreeNode *data[MAX_QUEUE_SIZE];
    int front;
    int rear;
};

void initQueue(struct Queue *queue) {
    queue->front = 0;
    queue->rear = 0;
}

int isQueueEmpty(struct Queue *queue) {
    return queue->front == queue->rear;
}

void enqueue(struct Queue *queue, struct TreeNode *node) {
    if ((queue->rear + 1) % MAX_QUEUE_SIZE == queue->front) {
        printf("Queue is full.
");
        return;
    }
    queue->data[queue->rear] = node;
    queue->rear = (queue->rear + 1) % MAX_QUEUE_SIZE;
}

struct TreeNode *dequeue(struct Queue *queue) {
    if (isQueueEmpty(queue)) {
        printf("Queue is empty.
");
        return NULL;
    }
    struct TreeNode *node = queue->data[queue->front];
    queue->front = (queue->front + 1) % MAX_QUEUE_SIZE;
    return node;
}

void reverseLevelOrder(struct TreeNode *root) {
    if (root == NULL) {
        return;
    }
    
    struct Queue queue;
    initQueue(&queue);
    struct TreeNode *node;
    struct TreeNode *stack[MAX_QUEUE_SIZE];
    int top = -1;
    
    enqueue(&queue, root);
    while (!isQueueEmpty(&queue)) {
        node = dequeue(&queue);
        stack[++top] = node;
        if (node->right != NULL) {
            enqueue(&queue, node->right);
        }
        if (node->left != NULL) {
            enqueue(&queue, node->left);
        }
    }
    
    while (top >= 0) {
        node = stack[top--];
        printf("%d ", node->val);
    }
}

int main() {
    // 构建二叉树
    struct TreeNode *root = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    root->val = 1;
    
    struct TreeNode *node1 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node1->val = 2;
    
    struct TreeNode *node2 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node2->val = 3;
    
    struct TreeNode *node3 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node3->val = 4;
    
    struct TreeNode *node4 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node4->val = 5;
    
    root->left = node1;
    root->right = node2;
    node1->left = node3;
    node1->right = node4;
    node2->left = NULL;
    node2->right = NULL;
    node3->left = NULL;
    node3->right = NULL;
    node4->left = NULL;
    node4->right = NULL;
    
    // 自下而上,从右到左的层次遍历
    reverseLevelOrder(root);
    
    return 0;
}

输出结果为:

5 4 3 2 1

以上代码中,我们使用了一个队列来辅助进行层次遍历,同时使用了一个栈来按照从右到左的顺序保存每一层的节点。首先将根节点入队列,然后进行循环,每次出队列一个节点,将该节点入栈,并将其右子节点和左子节点依次入队列。最后,循环结束后,依次出栈并打印节点的值,即可实现自下而上、从右到左的层次遍历。

C语言实现二叉树自下而上从右到左层次遍历

原文地址: https://www.cveoy.top/t/topic/p2sy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录