#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;
}

代码说明:

  1. 结构体定义: 定义了二叉树节点的结构,包括数据域、左子树指针和右子树指针。
  2. create函数: 创建一个新的节点,并初始化其数据和左右子树指针。
  3. insert函数: 将一个新的节点插入到二叉树中,根据lr的值决定插入到父节点的左子树还是右子树。
  4. isLeaf函数: 判断一个节点是否为叶子节点,即左右子树指针都为空。
  5. findLeaves函数: 递归遍历二叉树,找到所有叶子节点并打印其数据。
  6. freeTree函数: 递归释放二叉树所有节点占用的内存空间。
  7. main函数: 主函数,负责读取输入数据,构建二叉树,调用查找叶子节点函数和释放内存函数。

使用示例:

假设输入数据如下:

5
1 2 0
1 3 1
2 4 0
3 5 1

程序将会输出:

叶子节点:4 5

这表明二叉树的叶子节点为4和5。

C语言实现二叉树叶子节点查找及内存释放

原文地址: https://www.cveoy.top/t/topic/Xwt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录