二叉树层次遍历递归算法
时间: 2023-10-04 15:12:28 浏览: 66
二叉链表存储结构是一种常用的二叉树存储方式,可以用来实现二叉树的层次遍历、先序遍历和中序遍历的非递归算法。
二叉树的层次遍历可以使用队列来实现。从根节点开始,将其入队,然后依次出队,并将其左右子节点入队,直到队列为空。这样就可以按照层次遍历的顺序输出二叉树的所有节点。
先序遍历的非递归算法可以使用栈来实现。从根节点开始,将其入栈,然后依次出栈,并将其右子节点和左子节点入栈,直到栈为空。这样就可以按照先序遍历的顺序输出二叉树的所有节点。
中序遍历的非递归算法也可以使用栈来实现。从根节点开始,将其入栈,然后将其左子节点入栈,直到左子节点为空。然后依次出栈,并将其右子节点入栈,直到栈为空。这样就可以按照中序遍历的顺序输出二叉树的所有节点。
相关问题
层次遍历二叉树算法c语言递归
层次遍历二叉树可以使用队列进行实现,不需要使用递归。
具体算法如下:
1. 创建一个空队列,将根节点入队。
2. 循环执行以下步骤,直到队列为空:
a. 取出队首元素,并输出该元素的值。
b. 如果该元素有左子节点,将左子节点入队。
c. 如果该元素有右子节点,将右子节点入队。
下面是使用C语言实现的层次遍历二叉树示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct Queue {
TreeNode **data;
int front;
int rear;
int capacity;
} Queue;
Queue* createQueue(int capacity) {
Queue *queue = (Queue *)malloc(sizeof(Queue));
queue->data = (TreeNode **)malloc(sizeof(TreeNode *) * capacity);
queue->front = 0;
queue->rear = -1;
queue->capacity = capacity;
return queue;
}
int isFull(Queue *queue) {
return (queue->rear == queue->capacity - 1);
}
int isEmpty(Queue *queue) {
return (queue->front > queue->rear);
}
void enqueue(Queue *queue, TreeNode *node) {
if (isFull(queue)) {
printf("Queue is full.\n");
return;
}
queue->rear++;
queue->data[queue->rear] = node;
}
TreeNode* dequeue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty.\n");
return NULL;
}
TreeNode *node = queue->data[queue->front];
queue->front++;
return node;
}
void levelOrder(TreeNode *root) {
if (root == NULL) {
printf("Tree is empty.\n");
return;
}
Queue *queue = createQueue(100);
enqueue(queue, root);
while (!isEmpty(queue)) {
TreeNode *node = dequeue(queue);
printf("%d ", node->val);
if (node->left != NULL) {
enqueue(queue, node->left);
}
if (node->right != NULL) {
enqueue(queue, node->right);
}
}
printf("\n");
}
int main() {
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode *)malloc(sizeof(TreeNode));
root->left->val = 2;
root->left->left = NULL;
root->left->right = NULL;
root->right = (TreeNode *)malloc(sizeof(TreeNode));
root->right->val = 3;
root->right->left = (TreeNode *)malloc(sizeof(TreeNode));
root->right->left->val = 4;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = (TreeNode *)malloc(sizeof(TreeNode));
root->right->right->val = 5;
root->right->right->left = NULL;
root->right->right->right = NULL;
printf("Level order traversal of binary tree: ");
levelOrder(root);
return 0;
}
```
输出结果:
```
Level order traversal of binary tree: 1 2 3 4 5
```
请写出二叉树非递归遍历算法、递归遍历算法 、层次遍历算法的伪代码。
好的,下面是二叉树非递归遍历算法、递归遍历算法、层次遍历算法的伪代码:
1. 二叉树非递归遍历算法(中序遍历)
```
非递归中序遍历二叉树(root为二叉树根节点):
1. 将root节点入栈;
2. 当栈不为空时,取出栈顶元素,如果该元素左子树不为空,则将其左子树全部入栈;
3. 如果该元素左子树为空,或者左子树已经被访问过了,则输出该节点的值,并将其右子树入栈;
4. 重复步骤2~3,直到栈为空为止。
```
2. 二叉树递归遍历算法(先序遍历)
```
递归先序遍历二叉树(root为二叉树根节点):
1. 如果root节点为空,直接返回;
2. 输出root节点的值;
3. 递归遍历root节点的左子树;
4. 递归遍历root节点的右子树。
```
3. 二叉树层次遍历算法
```
层次遍历二叉树(root为二叉树根节点):
1. 将root节点入队列;
2. 当队列不为空时,取出队首元素,输出其值;
3. 如果该元素的左子树不为空,则将其左子树入队列;
4. 如果该元素的右子树不为空,则将其右子树入队列;
5. 重复步骤2~4,直到队列为空为止。
```
以上就是二叉树非递归遍历算法、递归遍历算法、层次遍历算法的伪代码。