二叉树层次遍历,要求使用递归,用C语言实现,核心代码
时间: 2023-09-03 19:27:30 浏览: 114
二叉树的层次遍历用C语言
### 回答1:
二叉树层次遍历是指按照树的层次一层一层地遍历二叉树的节点。层次遍历的顺序通常是从上到下,从左到右。
以下是用递归实现二叉树层次遍历的 C 语言代码的核心部分:
```
void levelOrder(struct TreeNode* root) {
if (root == NULL) return;
int h = height(root);
for (int i = 1; i <= h; i++)
printGivenLevel(root, i);
}
void printGivenLevel(struct TreeNode* root, int level) {
if (root == NULL) return;
if (level == 1)
printf("%d ", root->val);
else if (level > 1) {
printGivenLevel(root->left, level-1);
printGivenLevel(root->right, level-1);
}
}
int height(struct TreeNode* root) {
if (root == NULL) return 0;
else {
int lheight = height(root->left);
int rheight = height(root->right);
if (lheight > rheight) return lheight+1;
else return rheight+1;
}
}
```
在这段代码中,我们定义了三个函数:
- `levelOrder` 函数用于对二叉树进行层次遍历。
- `printGivenLevel` 函数用于打印给定层的所有节点的值。
- `height` 函数用于计算二叉树的高度。
在 `levelOrder` 函数中,我们首先检查根节点是否为空。如果为空,则直接返回。否则,我们调用 `height` 函数计算二叉树的高度,然后循环调用 `printGivenLevel` 函数来打印每一层的节点。
在 `printGivenLevel` 函数中,我们首先检查根节点是否为空。如果
### 回答2:
二叉树的层次遍历是一种广度优先的遍历方式,主要通过队列实现。虽然要求使用递归实现,但递归本身并不适用于层次遍历,因为递归会将当前层的所有节点都处理完再递归到下一层,而这与层次遍历的逻辑并不一致。因此,用递归来实现二叉树的层次遍历并不是最优的选择。以下是一个用递归实现层次遍历的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
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 getHeight(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}
void printCurrentLevel(struct TreeNode* root, int level) {
if (root == NULL) {
return;
}
if (level == 1) {
printf("%d ", root->val);
} else if (level > 1) {
printCurrentLevel(root->left, level - 1);
printCurrentLevel(root->right, level - 1);
}
}
void levelOrderTraversal(struct TreeNode* root) {
int height = getHeight(root);
for (int i = 1; i <= height; i++) {
printCurrentLevel(root, i);
}
}
int main() {
struct TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
printf("层次遍历结果为:");
levelOrderTraversal(root);
return 0;
}
```
上述代码中,`TreeNode`结构体表示二叉树的节点,`createNode`函数用于创建一个新的节点,`getHeight`函数用于计算二叉树的高度,`printCurrentLevel`函数用于按层打印当前层的节点,`levelOrderTraversal`函数用于进行层次遍历,`main`函数中创建了一个示例二叉树并进行层次遍历打印。
### 回答3:
二叉树的层次遍历是一种广度优先搜索(BFS)的算法,它的实现可以用递归。下面是用C语言实现二叉树层次遍历的核心代码:
```c
#include<stdio.h>
#include<stdlib.h>
// 二叉树结点的定义
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 获取二叉树的高度
int getHeight(TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
}
// 递归打印二叉树指定层的结点
void printLevel(TreeNode* root, int level) {
if (root == NULL) {
return;
}
if (level == 1) {
printf("%d ", root->val);
} else if (level > 1) {
printLevel(root->left, level - 1);
printLevel(root->right, level - 1);
}
}
// 递归层次遍历二叉树
void levelOrderTraversal(TreeNode* root) {
int height = getHeight(root);
int i;
for (i = 1; i <= height; i++) {
printLevel(root, i);
}
}
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 = NULL;
root->right->right = NULL;
// 层次遍历二叉树
levelOrderTraversal(root);
return 0;
}
```
以上代码定义了二叉树结点 `TreeNode`,包括结点值 `val`、左子树指针 `left` 和右子树指针 `right`。`getHeight` 函数用于获取二叉树的高度。`printLevel` 函数用于递归打印二叉树指定层的结点。`levelOrderTraversal` 函数用于遍历二叉树的所有层次。在 `main` 函数中创建了一个简单的二叉树,并调用 `levelOrderTraversal` 函数进行层次遍历。
以上代码递归地遍历二叉树的每个结点,并按层次打印结点值。最终的输出结果是按层次遍历的二叉树结点值序列。
阅读全文