C语言实现二叉树叶子节点查找及内存释放
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义二叉树节点结构
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
// 创建新节点
Node* create(int data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入节点
Node* insert(Node* root, int parent, int child, int lr) {
Node* node = create(child);
Node* p;
if (root == NULL) {
return node;
}
// 找到父节点
if (root->data == parent)
{
p = root;
}
else
{
p = insert(root->left, parent, child, lr);
if (p == NULL) {
p = insert(root->right, parent, child, lr);
}
}
// 插入新节点
if (lr == 0) {
p->left = node;
} else {
p->right = node;
}
return p;
}
// 判断节点是否为叶子节点
bool isLeaf(Node* node)
{
return (node->left == NULL && node->right == NULL);
}
// 遍历二叉树,找出所有叶子节点
void findLeaves(Node* root) {
if (root == NULL) {
return;
}
if (isLeaf(root)) {
printf('%d ', root->data);
} else {
findLeaves(root->left);
findLeaves(root->right);
}
}
// 释放二叉树的内存
void freeTree(Node* root) {
if (root == NULL) {
return;
}
freeTree(root->left);
freeTree(root->right);
free(root);
}
int main() {
int n;
scanf('%d', &n);
Node* root = NULL;
for (int i = 0; i < n - 1; i++)
{
int a, b, lr;
scanf('%d %d %d', &a, &b, &lr);
if (root == NULL)
{
root = create(a);
}
insert(root, a, b, lr);
}
printf('叶子节点:');
findLeaves(root);
printf('\n');
freeTree(root);
return 0;
}
代码说明:
- 结构体定义: 定义了二叉树节点的结构,包括数据域、左子树指针和右子树指针。
- create函数: 创建一个新的节点,并初始化其数据和左右子树指针。
- insert函数: 将一个新的节点插入到二叉树中,根据lr的值决定插入到父节点的左子树还是右子树。
- isLeaf函数: 判断一个节点是否为叶子节点,即左右子树指针都为空。
- findLeaves函数: 递归遍历二叉树,找到所有叶子节点并打印其数据。
- freeTree函数: 递归释放二叉树所有节点占用的内存空间。
- main函数: 主函数,负责读取输入数据,构建二叉树,调用查找叶子节点函数和释放内存函数。
使用示例:
假设输入数据如下:
5
1 2 0
1 3 1
2 4 0
3 5 1
程序将会输出:
叶子节点:4 5
这表明二叉树的叶子节点为4和5。
原文地址: https://www.cveoy.top/t/topic/Xwt 著作权归作者所有。请勿转载和采集!