二叉树自下而上,从右到左的层次遍历算法详解及C语言代码实现
"二叉树自下而上,从右到左的层次遍历算法可以使用队列来实现。具体思路如下:\n\n1. 创建一个队列,并将根节点入队。\n2. 创建一个空的栈。\n3. 当队列不为空时,执行以下操作:\n a. 出队一个节点,并将其值入栈。\n b. 如果该节点有右子节点,将右子节点入队。\n c. 如果该节点有左子节点,将左子节点入队。\n4. 将栈中的元素依次出栈,即可得到自下而上,从右到左的层次遍历结果。\n\n以下是使用C语言实现的代码:\n\nc\n#include <stdio.h>\n#include <stdlib.h>\n\n// 定义二叉树节点结构\ntypedef struct TreeNode {\n int value;\n struct TreeNode* left;\n struct TreeNode* right;\n} TreeNode;\n\n// 定义队列节点结构\ntypedef struct QueueNode {\n TreeNode* data;\n struct QueueNode* next;\n} QueueNode;\n\n// 定义队列结构\ntypedef struct Queue {\n QueueNode* front;\n QueueNode* rear;\n} Queue;\n\n// 初始化队列\nvoid initQueue(Queue* queue) {\n queue->front = NULL;\n queue->rear = NULL;\n}\n\n// 判断队列是否为空\nint isEmpty(Queue* queue) {\n return queue->front == NULL;\n}\n\n// 入队\nvoid enqueue(Queue* queue, TreeNode* data) {\n QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));\n newNode->data = data;\n newNode->next = NULL;\n if (isEmpty(queue)) {\n queue->front = newNode;\n queue->rear = newNode;\n } else {\n queue->rear->next = newNode;\n queue->rear = newNode;\n }\n}\n\n// 出队\nTreeNode* dequeue(Queue* queue) {\n if (isEmpty(queue)) {\n return NULL;\n }\n QueueNode* frontNode = queue->front;\n TreeNode* data = frontNode->data;\n queue->front = frontNode->next;\n if (queue->front == NULL) {\n queue->rear = NULL;\n }\n free(frontNode);\n return data;\n}\n\n// 入栈\nvoid push(TreeNode** stack, int* top, int value) {\n (*top)++;\n stack[*top] = (TreeNode*)malloc(sizeof(TreeNode));\n stack[*top]->value = value;\n}\n\n// 出栈\nTreeNode* pop(TreeNode** stack, int* top) {\n TreeNode* node = stack[*top];\n (*top)--;\n return node;\n}\n\n// 自下而上,从右到左的层次遍历\nvoid levelOrderTraversal(TreeNode* root) {\n if (root == NULL) {\n return;\n }\n \n Queue queue;\n initQueue(&queue);\n \n // 将根节点入队\n enqueue(&queue, root);\n \n int size = 20; // 栈的大小\n TreeNode* stack[size]; // 创建一个栈\n int top = -1; // 栈顶指针\n \n // 遍历队列中的节点\n while (!isEmpty(&queue)) {\n TreeNode* node = dequeue(&queue);\n push(stack, &top, node->value); // 将节点值入栈\n \n // 将右子节点入队\n if (node->right != NULL) {\n enqueue(&queue, node->right);\n }\n \n // 将左子节点入队\n if (node->left != NULL) {\n enqueue(&queue, node->left);\n }\n }\n \n // 出栈并打印栈中的节点值\n while (top >= 0) {\n TreeNode* node = pop(stack, &top);\n printf("%d ", node->value);\n }\n}\n\nint main() {\n // 构造一个二叉树\n TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));\n root->value = 1;\n root->left = (TreeNode*)malloc(sizeof(TreeNode));\n root->left->value = 2;\n root->right = (TreeNode*)malloc(sizeof(TreeNode));\n root->right->value = 3;\n root->left->left = NULL;\n root->left->right = NULL;\n root->right->left = (TreeNode*)malloc(sizeof(TreeNode));\n root->right->left->value = 4;\n root->right->right = NULL;\n root->right->left->left = NULL;\n root->right->left->right = NULL;\n \n // 自下而上,从右到左的层次遍历\n levelOrderTraversal(root);\n \n return 0;\n}\n\n\n输出结果为:4 3 2 1
原文地址: https://www.cveoy.top/t/topic/p2sC 著作权归作者所有。请勿转载和采集!