用递归的方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的前序遍历结果; 3.输出二叉树的中序遍历结果; 4.输出二叉树的后序遍历结果; 5.计算二叉树的深度; 6.统计
时间: 2023-12-01 17:24:52 浏览: 507
节点数。
我了解你的问题,请稍等片刻。以下是针对你的问题的回答:
对于你的问题,我已经理解了。使用递归实现该算法的伪代码如下:
1. 定义二叉树节点结构体(包含左右子树指针和数值)。
2. 以先序遍历的方式输入节点数值,创建二叉树。
3. 前序遍历:输出当前节点的数值,然后递归遍历左子树,再递归遍历右子树。
4. 中序遍历:递归遍历左子树,输出当前节点的数值,再递归遍历右子树。
5. 后序遍历:递归遍历左子树,递归遍历右子树,最后输出当前节点的数值。
6. 计算深度:如果树为空,深度为0;否则,递归计算左右子树深度,取更大值再加1。
7. 统计节点数:如果树为空,节点数为0;否则,递归统计左右子树节点数,相加再加1。
以上是我对你提出的问题的回答,希望能对你有所帮助。如果你还有其他问题,请随时提出。
相关问题
c语言用递归的方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树(算法 5.3); 2.输出二叉树的中序遍历结果(算法 5.1); 3.输出二叉树的前序遍历结果(见讲稿); 4.输出二叉树的后序遍历结果(见讲稿); 5.计算二叉树的深度(算法 5.5); 6.统计二叉树的结点个数(算法 5.6); 7.统计二叉树的叶结点个数; 8.统计二叉树的度为 1 的结点个数; 9.输出二叉树中从每个叶子结点到根结点的路径。
好的,以下是实现这些算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构体
typedef struct TreeNode {
int data; // 数据域
struct TreeNode *left; // 左子树指针
struct TreeNode *right; // 右子树指针
} TreeNode, *Tree;
// 建立二叉树
void createTree(Tree *t) {
int data;
scanf("%d", &data);
if (data == -1) { // 输入 -1 表示该节点为空
*t = NULL;
} else {
*t = (Tree)malloc(sizeof(TreeNode)); // 创建新节点
(*t)->data = data;
createTree(&((*t)->left)); // 递归创建左子树
createTree(&((*t)->right)); // 递归创建右子树
}
}
// 中序遍历
void inorderTraversal(Tree t) {
if (t != NULL) {
inorderTraversal(t->left); // 先遍历左子树
printf("%d ", t->data); // 访问根节点
inorderTraversal(t->right); // 再遍历右子树
}
}
// 前序遍历
void preorderTraversal(Tree t) {
if (t != NULL) {
printf("%d ", t->data); // 访问根节点
preorderTraversal(t->left); // 先遍历左子树
preorderTraversal(t->right); // 再遍历右子树
}
}
// 后序遍历
void postorderTraversal(Tree t) {
if (t != NULL) {
postorderTraversal(t->left); // 先遍历左子树
postorderTraversal(t->right); // 再遍历右子树
printf("%d ", t->data); // 访问根节点
}
}
// 计算二叉树深度
int getDepth(Tree t) {
if (t == NULL) {
return 0;
} else {
int leftDepth = getDepth(t->left); // 计算左子树深度
int rightDepth = getDepth(t->right); // 计算右子树深度
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1; // 返回深度较大的值加上 1
}
}
// 统计节点个数
int getNodeCount(Tree t) {
if (t == NULL) {
return 0;
} else {
return getNodeCount(t->left) + getNodeCount(t->right) + 1; // 左子树节点数加右子树节点数加上自身
}
}
// 统计叶子节点个数
int getLeafCount(Tree t) {
if (t == NULL) {
return 0;
} else if (t->left == NULL && t->right == NULL) { // 如果是叶节点
return 1;
} else {
return getLeafCount(t->left) + getLeafCount(t->right); // 左子树叶子节点数加右子树叶子节点数
}
}
// 统计度为 1 的节点个数
int getDegree1Count(Tree t) {
if (t == NULL) {
return 0;
} else if (t->left == NULL && t->right != NULL) { // 如果只有右子树
return getDegree1Count(t->right) + 1; // 右子树中度为 1 的节点数加上自身
} else if (t->left != NULL && t->right == NULL) { // 如果只有左子树
return getDegree1Count(t->left) + 1; // 左子树中度为 1 的节点数加上自身
} else { // 否则递归统计左右子树中度为 1 的节点数
return getDegree1Count(t->left) + getDegree1Count(t->right);
}
}
// 输出从叶子节点到根节点的路径
void printPathsFromLeavesToRoot(Tree t, int path[], int pathLen) {
if (t == NULL) {
return;
} else {
path[pathLen++] = t->data; // 将当前节点加入路径
if (t->left == NULL && t->right == NULL) { // 如果是叶节点,输出路径
printf("Path: ");
for (int i = pathLen - 1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\n");
} else {
printPathsFromLeavesToRoot(t->left, path, pathLen); // 递归遍历左子树
printPathsFromLeavesToRoot(t->right, path, pathLen); // 递归遍历右子树
}
}
}
int main() {
Tree t;
printf("请输入一棵二叉树(-1表示该节点为空):\n");
createTree(&t); // 建立二叉树
printf("中序遍历结果为:");
inorderTraversal(t); // 中序遍历
printf("\n前序遍历结果为:");
preorderTraversal(t); // 前序遍历
printf("\n后序遍历结果为:");
postorderTraversal(t); // 后序遍历
printf("\n二叉树深度为:%d\n", getDepth(t)); // 计算深度
printf("二叉树节点个数为:%d\n", getNodeCount(t)); // 统计节点个数
printf("二叉树叶子节点个数为:%d\n", getLeafCount(t)); // 统计叶子节点个数
printf("二叉树度为1的节点个数为:%d\n", getDegree1Count(t)); // 统计度为 1 的节点个数
int path[1000];
printf("从每个叶子节点到根节点的路径为:\n");
printPathsFromLeavesToRoot(t, path, 0); // 输出从叶子节点到根节点的路径
return 0;
}
```
希望这份代码能够帮助到你!
用递归的方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树; 2.输出二叉树的中序遍历结果; 3.输出二叉树的前序遍历结果; 4.输出二叉树的后序遍历结果; 5.计算二叉树的深度; 6.统计二叉树的叶结点个数; 7.输出二叉树中从每个叶子结点到根结点的路径。
1. 建立二叉树的递归函数:
```
// 定义二叉树结点
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 建立二叉树的递归函数
TreeNode* buildTree() {
int val;
cin >> val;
if (val == -1) { // 输入-1表示该节点为空
return nullptr;
}
TreeNode* root = new TreeNode(val);
root->left = buildTree(); // 递归建立左子树
root->right = buildTree(); // 递归建立右子树
return root;
}
```
2. 中序遍历的递归函数:
```
void inorder(TreeNode* root) {
if (root == nullptr) {
return;
}
inorder(root->left);
cout << root->val << " ";
inorder(root->right);
}
```
3. 前序遍历的递归函数:
```
void preorder(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->val << " ";
preorder(root->left);
preorder(root->right);
}
```
4. 后序遍历的递归函数:
```
void postorder(TreeNode* root) {
if (root == nullptr) {
return;
}
postorder(root->left);
postorder(root->right);
cout << root->val << " ";
}
```
5. 计算二叉树深度的递归函数:
```
int depth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int left_depth = depth(root->left);
int right_depth = depth(root->right);
return max(left_depth, right_depth) + 1;
}
```
6. 统计二叉树叶结点个数的递归函数:
```
int countLeaves(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) { // 叶结点
return 1;
}
return countLeaves(root->left) + countLeaves(root->right);
}
```
7. 输出二叉树中从每个叶子结点到根结点的路径的递归函数:
```
void printPath(TreeNode* root, vector<int>& path) {
if (root == nullptr) {
return;
}
path.push_back(root->val);
if (root->left == nullptr && root->right == nullptr) { // 叶结点
for (int i = path.size() - 1; i >= 0; i--) { // 逆序输出路径
cout << path[i] << " ";
}
cout << endl;
}
printPath(root->left, path); // 递归左子树
printPath(root->right, path); // 递归右子树
path.pop_back(); // 回溯,撤销该节点的选择
}
```
阅读全文