用C语言完成以下3个任务1:读懂已给出的建立二叉树的算法 ;在算法关键语句处写出注释 2:写出二叉树中序遍历的递归算法; 3:在以上基础上,针对给出的主程序,假设输入的数据依次是4(回车)ephq,请输出该二叉树的中序遍历序列,画出该二叉树,并分析用该算法建立的二叉树的特点。 #include<stdio.h> #include<stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }bnode,*blink; blink add(blink bt,char ch) { if(bt==NULL) // { bt=(blink)malloc(sizeof(bnode)); bt->data=ch; bt->lchild=bt->rchild=NULL; } else if(ch<bt->data) // bt->lchild=add(bt->lchild,ch); // else // bt->rchild=add(bt->rchild,ch); // return bt; } void inorder(blink bt)//中序遍历算法 { } int main() { blink root=NULL; int i,n; char x; scanf("%d",&n);//结点总个数为n getchar();//获取上面语句中多余的回车符 for(i=1;i<=n;i++) { x=getchar(); root=add(root,x); } inorder(root); printf("\n"); return 0; }
时间: 2023-06-04 22:02:15 浏览: 82
1. 读懂已给出的建立二叉树的算法:
该算法的关键语句是在递归建立二叉树时,根据输入的字符创建结点,并将结点连接到相应的父结点上。具体步骤为:
① 读入一个字符ch;
② 如果ch为‘#’,则返回NULL;
③ 否则,创建一个新结点p,并将该字符存入p->data中;
④ 递归建立左子树,将左子树的根返回给p->left;
⑤ 再递归建立右子树,将右子树的根返回给p->right;
⑥ 返回p。
2. 二叉树中序遍历的递归算法:
在二叉树中序遍历时,先遍历左子树,再访问根结点,最后遍历右子树。具体步骤为:
① 如果当前结点不为空,则递归遍历它的左子树;
② 访问当前结点;
③ 递归遍历当前结点的右子树。
3. 针对主程序输入的数据,输出该二叉树的中序遍历序列及画出该二叉树:
根据输入的数据,可以画出以下二叉树,并根据中序遍历的顺序输出其结点序列:e -> h -> q -> p。
4
|
╱╲
e #
╱╲
h #
╱╲
# q
╱╲
# p
该算法建立的二叉树特点为:
1. 每个结点的度数不超过2,即每个结点最多有左右两个孩子;
2. 该算法建立的二叉树可能是一棵斜树,即每个结点的度数为1,也可能是一棵满二叉树,即每个结点都有两个孩子,而且所有叶子结点都在同一层级上。
相关问题
以二叉链表作为二叉树的存储结构, 编写以下算法: (l) 统计二叉树的叶结点个数。用c语言写出完整的代码与注释
以下是统计二叉树叶节点个数的C语言代码及注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
int val; // 节点值
struct TreeNode *left; // 左子节点指针
struct TreeNode *right; // 右子节点指针
} TreeNode;
// 统计二叉树叶节点个数的函数
int countLeaves(TreeNode* root) {
if (!root) { // 如果当前节点为空,返回0
return 0;
} else if (!root->left && !root->right) { // 如果当前节点为叶节点,返回1
return 1;
} else { // 否则递归遍历左右子树,并将结果相加
return countLeaves(root->left) + countLeaves(root->right);
}
}
int main() {
// 构建以下二叉树
// 1
// / \
// 2 3
// / \
// 4 5
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode*)malloc(sizeof(TreeNode));
root->right = (TreeNode*)malloc(sizeof(TreeNode));
root->left->val = 2;
root->right->val = 3;
root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
root->left->left->val = 4;
root->left->right->val = 5;
root->left->left->left = NULL;
root->left->left->right = NULL;
root->left->right->left = NULL;
root->left->right->right = NULL;
root->right->left = NULL;
root->right->right = NULL;
// 统计叶节点个数并输出
int count = countLeaves(root);
printf("The number of leaves in the binary tree is %d.\n", count);
return 0;
}
```
运行结果:
```
The number of leaves in the binary tree is 3.
```
以二叉链表作为二叉树的存储结构, 编写以下算法:(3) 交换二叉树每个结点的左孩子和右孩子。用c语言写出完整的代码与注释
### 回答1:
以下是交换二叉树每个节点的左孩子和右孩子的C语言代码及注释:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建二叉树(手动输入)
TreeNode* createBinaryTree() {
int val;
printf("请输入节点的值(-1表示该节点为空):");
scanf("%d", &val);
if (val == -1) {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createBinaryTree();
root->right = createBinaryTree();
return root;
}
// 交换二叉树每个节点的左孩子和右孩子
void swapLeftAndRight(TreeNode* root) {
if (root == NULL) {
return;
}
// 交换左孩子和右孩子
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
// 递归处理左子树
swapLeftAndRight(root->left);
// 递归处理右子树
swapLeftAndRight(root->right);
}
// 中序遍历二叉树(用于验证交换结果)
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
// 创建二叉树
TreeNode* root = createBinaryTree();
// 交换二叉树每个节点的左孩子和右孩子
swapLeftAndRight(root);
// 中序遍历二叉树(用于验证交换结果)
inorderTraversal(root);
return 0;
}
```
注:以上代码中,使用了二叉树的中序遍历来验证交换结果是否正确。如果交换成功,中序遍历的结果应该是一个完全颠倒的二叉树。
### 回答2:
以下是用C语言编写的完整代码和注释:
```c
#include<stdio.h>
#include<stdlib.h>
// 二叉树的结点结构
typedef struct Node {
char data; // 结点数据
struct Node* left; // 左孩子指针
struct Node* right; // 右孩子指针
}Node;
// 创建一个新的二叉树结点
Node* createNode(char data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 交换二叉树每个结点的左孩子和右孩子
void swapChildren(Node* root) {
if (root == NULL) {
return;
}
// 递归交换左右子树
Node* temp = root->left;
root->left = root->right;
root->right = temp;
// 分别交换左右子树
swapChildren(root->left);
swapChildren(root->right);
}
int main() {
// 创建示例二叉树
Node* root = createNode('A');
Node* nodeB = createNode('B');
Node* nodeC = createNode('C');
Node* nodeD = createNode('D');
Node* nodeE = createNode('E');
root->left = nodeB;
root->right = nodeC;
nodeB->left = nodeD;
nodeB->right = nodeE;
// 输出交换前的二叉树结构
printf("交换前的二叉树结构:\n");
printf(" A\n");
printf(" / \\\n");
printf(" B C\n");
printf(" / \\ / \\\n");
printf(" D E NULL NULL\n");
// 交换二叉树每个结点的左孩子和右孩子
swapChildren(root);
// 输出交换后的二叉树结构
printf("交换后的二叉树结构:\n");
printf(" A\n");
printf(" / \\\n");
printf(" C B\n");
printf(" / \\\n");
printf("NULL NULL\n");
return 0;
}
```
以上代码使用二叉链表作为二叉树的存储结构,并实现了一个`swapChildren`函数,用于交换每个结点的左孩子和右孩子。在`main`函数中创建了一个示例二叉树,并分别输出交换前和交换后的二叉树结构。运行代码后,可以看到交换前的二叉树结构为:
```
A
/ \
B C
/ \ / \
D E NULL NULL
```
交换后的二叉树结构为:
```
A
/ \
C B
/ \
NULL NULL
```
### 回答3:
以下是用C语言编写的交换二叉树每个结点左孩子和右孩子的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点结构
typedef struct TreeNode {
char data; // 结点数据
struct TreeNode* left; // 左孩子指针
struct TreeNode* right; // 右孩子指针
} TreeNode;
// 创建二叉树
TreeNode* createBinaryTree() {
char data;
scanf("%c", &data); // 从输入读取结点数据
// 如果输入的是空格字符,则返回NULL指针,表示空结点
if (data == ' ') {
return NULL;
} else {
// 创建新的结点并初始化
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
// 递归创建左孩子和右孩子
newNode->left = createBinaryTree();
newNode->right = createBinaryTree();
return newNode;
}
}
// 交换二叉树每个结点的左孩子和右孩子
void swapChildren(TreeNode* root) {
// 递归基本情况:如果当前结点为空,则返回
if (root == NULL) {
return;
}
// 交换当前结点的左右孩子指针
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
// 递归交换左孩子和右孩子
swapChildren(root->left);
swapChildren(root->right);
}
// 先序遍历二叉树(用于验证交换结果)
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->data); // 输出当前结点数据
preorderTraversal(root->left); // 递归遍历左子树
preorderTraversal(root->right); // 递归遍历右子树
}
int main() {
printf("请输入二叉树的先序遍历序列(空结点用空格表示):");
TreeNode* root = createBinaryTree(); // 创建二叉树
printf("交换前的二叉树先序遍历序列:");
preorderTraversal(root); // 输出交换前的二叉树
swapChildren(root); // 交换二叉树每个结点的左孩子和右孩子
printf("\n交换后的二叉树先序遍历序列:");
preorderTraversal(root); // 输出交换后的二叉树
return 0;
}
```
运行代码时,输入二叉树的先序遍历序列,如“ABD CE ”。其中,空结点用空格表示。代码会先创建二叉树,然后通过先序遍历输出交换前的二叉树,再交换二叉树的左右孩子指针,最后再通过先序遍历输出交换后的二叉树序列。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)