#include <stdio.h> #include <stdlib.h> #define MAX_N 100 typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; } TreeNode; int findIdx(char *arr, int start, int end, char val) { for (int i = start; i <= end; i++) { if (arr[i] == val) { return i; } } return -1; } TreeNode *buildTree(char *preorder, char *inorder, int start, int end) { static int preIdx = 0; if (start > end) { return NULL; } TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->val = preorder[preIdx++]; if (start == end) { node->left = NULL; node->right = NULL; return node; } int inIdx = findIdx(inorder, start, end, node->val); node->left = buildTree(preorder, inorder, start, inIdx - 1); node->right = buildTree(preorder, inorder, inIdx + 1, end); return node; } int getNodeCount(TreeNode *root) { if (root == NULL) { return 0; } return getNodeCount(root->left) + getNodeCount(root->right) + 1; } void printLevelOrder(TreeNode *root) { if (root == NULL) { return; } TreeNode *queue[MAX_N]; int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { int levelSize = rear - front; for (int i = 0; i < levelSize; i++) { TreeNode *node = queue[front++]; printf("%c ", node->val); if (node->left) { queue[rear++] = node->left; } if (node->right) { queue[rear++] = node->right; } } printf("\n"); } } int getChildCount(TreeNode *node) { if (!node || (!node->left && !node->right)) { return 0; } int count = 0; if (node->left) { count++; } if (node->right) { count++; } return count; } int main() { char preorder[MAX_N], inorder[MAX_N], target; int n, len; printf("请输入二叉树长度、先序序列、中序序列:\n"); scanf("%d%s%s", &n, preorder, inorder); len = strlen(preorder); TreeNode *root = buildTree(preorder, inorder, 0, len - 1); printf("层序遍历:\n"); printLevelOrder(root); printf("节点个数为:%d\n", getNodeCount(root)); printf("请输入要查询子节点的节点:\n"); scanf(" %c", &target); TreeNode *node = root; while (node && node->val != target) { if (node->val > target) { node = node->left; } else { node = node->right; } } if (!node) { printf("未找到该节点!\n"); } else { printf("子节点个数为:%d\n", getChildCount(node)); } return 0; }
时间: 2024-04-05 10:34:29 浏览: 86
这段代码是一段用 C 语言写的二叉树的操作程序。它实现了二叉树的构建、节点数量的统计、层序遍历、以及查询某个节点的子节点数量。其中,buildTree 函数用先序遍历和中序遍历序列构建二叉树,getNodeCount 函数用递归的方式统计二叉树的节点数量,printLevelOrder 函数用队列实现二叉树的层序遍历,getChildCount 函数用来查询某个节点的子节点数量。这段程序还包含了一些输入输出的操作,例如读入二叉树的长度和先序、中序序列,以及输出层序遍历结果和节点数量。
相关问题
#include<stdio.h> #include<stdlib.h> define char TElemType typedef struct BiTNode{ TElemType data; struct BiTNode *lchild; struct BiTNode *rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree *T) { char ch; scanf("%c", &ch); if (ch == '#') { *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void printTree(TreeNode* root) { if (root == NULL) { printf("# "); return; } printf("%c ", root->val); printTree(root->left); printTree(root->right); } int main() { BiTree T = NULL; printf("请输入先序遍历序列:\n"); CreateBiTree(&T); return 0; }这个C语言代码怎么改
这段代码存在一些问题:
1. `define char TElemType` 应该改为 `typedef char TElemType`,使得`TElemType` 成为一个类型别名,代表了二叉树节点的数据类型。
2. 函数 `printTree(TreeNode* root)` 没有声明,应该修改为 `void printTree(BiTree root)`。
修改后的代码如下:
```
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType; // 定义二叉树节点的数据类型
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree *T) {
char ch;
scanf("%c", &ch);
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void printTree(BiTree root) {
if (root == NULL) {
printf("# ");
return;
}
printf("%c ", root->data);
printTree(root->lchild);
printTree(root->rchild);
}
int main() {
BiTree T = NULL;
printf("请输入先序遍历序列:\n");
CreateBiTree(&T);
printTree(T);
return 0;
}
```
这样就可以正确地根据输入的先序遍历序列建立一棵以二叉链表表示的二叉树,并输出这棵树的先序遍历序列了。
说明:root 为二叉树的根指针,函数值为二叉树的结点数。 在“BinTree.h”中声明函数,在“BinTree.c”中实现函数。 BinTree.h
在 "BinTree.h" 中声明 `BinTreeNumNode` 函数,可以像下面这样写:
```c
#ifndef BINTREE_H
#define BINTREE_H
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
int BinTreeNumNode(const TreeNode* root);
#endif /* BINTREE_H */
```
其中,`BinTreeNumNode` 函数的声明如下:
```c
int BinTreeNumNode(const TreeNode* root);
```
在 "BinTree.c" 中实现 `BinTreeNumNode` 函数,可以像下面这样写:
```c
#include "BinTree.h"
#include <stdlib.h>
int BinTreeNumNode(const TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + BinTreeNumNode(root->left) + BinTreeNumNode(root->right);
}
// 创建一棵二叉树
TreeNode* create_tree() {
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = 1;
root->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->val = 2;
root->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->val = 3;
root->left->left = NULL;
root->left->right = NULL;
root->right->left = (TreeNode*)malloc(sizeof(TreeNode));
root->right->left->val = 4;
root->right->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->right->val = 5;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right->left = NULL;
root->right->right->right = NULL;
return root;
}
// 销毁一棵二叉树
void destroy_tree(TreeNode* root) {
if (root == NULL) {
return;
}
destroy_tree(root->left);
destroy_tree(root->right);
free(root);
}
```
其中,`BinTreeNumNode` 函数的实现和之前给出的一样。
另外,为了测试 `BinTreeNumNode` 函数,我们在 "BinTree.c" 中实现了创建一棵二叉树的函数 `create_tree` 和销毁一棵二叉树的函数 `destroy_tree`。
可以通过如下代码进行测试:
```c
#include "BinTree.h"
#include <stdio.h>
int main() {
// 构造一棵二叉树
TreeNode* root = create_tree();
// 计算结点个数
int num = BinTreeNumNode(root);
// 输出结果
printf("The number of nodes is: %d\n", num);
// 释放内存
destroy_tree(root);
return 0;
}
```
注意:在 "BinTree.c" 中引用了 "BinTree.h",因此需要通过编译器将 "BinTree.c" 和 "BinTree.h" 编译成一个可执行文件。
阅读全文