c语言读取二叉树当前结点
时间: 2024-10-26 08:17:17 浏览: 19
在C语言中,读取二叉树的当前节点通常涉及到递归遍历二叉树的过程。如果你想要获取某个特定节点的数据,假设你有一个结构体`TreeNode`定义了节点,包含数据`data`和指向左右子节点的指针`left`和`right`,你可以编写如下的函数:
```c
typedef struct TreeNode {
int data; // 节点存储的数据
struct TreeNode* left; // 左子节点指针
struct TreeNode* right; // 右子节点指针
} TreeNode;
// 用于获取并打印当前节点的函数
void printCurrentNode(TreeNode* node) {
if (node != NULL) { // 如果节点存在
printf("当前节点数据: %d\n", node->data);
printCurrentNode(node->left); // 递归左子树
printCurrentNode(node->right); // 递归右子树
} else {
printf("空节点\n");
}
}
```
在这个例子中,你需要先创建一个二叉树的根节点,并将其传递给`printCurrentNode`函数,它会从根开始递归地访问每个节点。
相关问题
C语言假设二叉树的结点值是字符,根据输入的一棵二叉树的完整先序遍历序列建立一棵以二叉链表表示的二叉树。
好的,根据您的问题,我可以给您提供以下的 C 语言代码,其中包括了建立二叉树的函数和打印二叉树的函数:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树的结构体
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建二叉树
TreeNode* createTree(char* preorder, int* index) {
char val = preorder[*index];
if (val == '#') {
return NULL;
}
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
(*index)++;
node->left = createTree(preorder, index);
(*index)++;
node->right = createTree(preorder, index);
return node;
}
// 打印二叉树
void printTree(TreeNode* root) {
if (root == NULL) {
printf("# ");
return;
}
printf("%c ", root->val);
printTree(root->left);
printTree(root->right);
}
int main() {
char preorder[] = "ABD##E##CF##G##";
int index = 0;
TreeNode* root = createTree(preorder, &index);
printf("先序遍历序列为:%s\n", preorder);
printf("生成的二叉树为:");
printTree(root);
printf("\n");
return 0;
}
```
这段代码中,我们首先定义了一个二叉树的结构体,其中包含了二叉树结点的值和左右子树的指针。然后,我们编写了一个 `createTree()` 函数来根据输入的先序遍历序列建立一棵二叉树。在函数中,我们首先读取当前的结点值,如果是字符 '#',则说明该结点为空,返回 NULL。否则,我们就创建一个新的结点,并将当前的值赋给它。然后,我们递归地调用 `createTree()` 函数来分别创建它的左子树和右子树,并将它们的指针分别赋给当前结点的 `left` 和 `right` 字段。最后,我们返回当前结点的指针。
接着,我们编写了一个 `printTree()` 函数来打印先序遍历序列。在函数中,我们首先判断当前结点是否为空,如果是,则打印字符 '#',表示该结点为空。否则,我们就打印当前结点的值,并递归地调用 `printTree()` 函数来打印它的左子树和右子树。
最后,在 `main()` 函数中,我们定义了一个先序遍历序列,然后调用 `createTree()` 函数来建立一棵二叉树,并调用 `printTree()` 函数来打印它。
写出可以运行的C语言代码,代码的目的是构造最优二叉树,使用标准输入和输出流,让程序从控制台读取输入并输出结果。要求输入包括字符集C[],字符集对应的频率表p[],字符个数n;输出为得到最优二叉树的结点表T[]和各字符霍夫曼编码。
以下是一个可以构造最优二叉树的C语言代码,使用标准输入和输出流:
```
#include <stdio.h>
#include <stdlib.h>
struct node
{
int freq;
char c;
struct node *left, *right;
};
struct node* newNode(char c, int freq)
{
struct node* node = (struct node*)malloc(sizeof(struct node));
node->left = NULL;
node->right = NULL;
node->c = c;
node->freq = freq;
return node;
}
void swap(struct node **a, struct node **b)
{
struct node *temp = *a;
*a = *b;
*b = temp;
}
void minHeapify(struct node **arr, int i, int n)
{
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left]->freq < arr[smallest]->freq)
smallest = left;
if (right < n && arr[right]->freq < arr[smallest]->freq)
smallest = right;
if (smallest != i)
{
swap(&arr[i], &arr[smallest]);
minHeapify(arr, smallest, n);
}
}
void buildMinHeap(struct node **arr, int n)
{
int i;
for (i = n / 2 - 1; i >= 0; --i)
minHeapify(arr, i, n);
}
struct node* extractMin(struct node **arr, int *n)
{
struct node* temp = arr[0];
arr[0] = arr[*n - 1];
--*n;
minHeapify(arr, 0, *n);
return temp;
}
void insert(struct node **arr, int *n, struct node* node)
{
++*n;
int i = *n - 1;
while (i && node->freq < arr[(i - 1) / 2]->freq)
{
arr[i] = arr[(i - 1) / 2];
i = (i - 1) / 2;
}
arr[i] = node;
}
struct node* buildHuffmanTree(char c[], int freq[], int n)
{
struct node *left, *right, *top;
int i;
int size = n;
struct node **arr = (struct node**)malloc(sizeof(struct node*) * n);
for (i = 0; i < n; ++i)
arr[i] = newNode(c[i], freq[i]);
buildMinHeap(arr, n);
while (size > 1)
{
left = extractMin(arr, &size);
right = extractMin(arr, &size);
top = newNode('$', left->freq + right->freq);
top->left = left;
top->right = right;
insert(arr, &size, top);
}
return extractMin(arr, &size);
}
void printCodes(struct node* root, int arr[], int top)
{
if (root->left)
{
arr[top] = 0;
printCodes(root->left, arr, top + 1);
}
if (root->right)
{
arr[top] = 1;
printCodes(root->right, arr, top + 1);
}
if (!root->left && !root->right)
{
printf("%c: ", root->c);
int i;
for (i = 0; i < top; ++i)
printf("%d", arr[i]);
printf("\n");
}
}
void HuffmanCodes(char c[], int freq[], int n)
{
struct node* root = buildHuffmanTree(c, freq, n);
int arr[100], top = 0;
printCodes(root, arr, top);
}
int main()
{
char c[] = {'a', 'b', 'c', 'd', 'e', 'f'};
int freq[] = {5, 9, 12, 13, 16, 45};
int n = sizeof(c) / sizeof(c[0]);
HuffmanCodes(c, freq, n);
return 0;
}
```
在这个代码中,我们首先定义了一个节点结构体,包括字符c、字符频率freq、左右子节点left和right。然后我们定义了一些辅助函数,比如newNode、swap、minHeapify、buildMinHeap、extractMin、insert和buildHuffmanTree。这些函数用于构建哈夫曼树。最后,我们定义了一个打印哈夫曼编码的函数printCodes和一个主函数,用于测试和运行代码。
在主函数中,我们声明了一个字符集数组c、一个字符集对应的频率表freq和字符个数n。然后,我们调用HuffmanCodes函数来构建哈夫曼树并打印哈夫曼编码。
您可以将输入信息设置为从控制台读取,然后将输出信息输出到控制台。
阅读全文