二叉树以二叉链表形式存储,编写程序输出所有叶子节点

 

目录

一、叶子节点

二、二叉链表存储二叉树

三、如何输入二叉树

 四、代码

五、运行结果:

六、建树

七、输出叶子节点


一、叶子节点

      在树结构中,叶子节点(Leaf Node) 也被称为终端节点或者外部节点。它是指没有任何子节点的节点,即没有最左侧节点和最右侧节点的节点(没有左孩子也没有右孩子)。

二、二叉链表存储二叉树

        二叉链表存储二叉树是一种常用的方式,将一个二叉树节点的信息保存为三个属性:data (数据元素),lchild (左子节点指针)和 rchild (右子节点指针),并使用指针来连接它们。

三、如何输入二叉树

      如果我需要创建如下图这个二叉树。

      那么输入的时候,就需要把空节点考虑进去(00代表空节点),如下图。 

       先序输入:

 四、代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct TreeNode 
{
	int val;
	struct TreeNode* lchild;
	struct TreeNode* rchild;
};

struct TreeNode* createBiTree()
{
	int data;
	struct TreeNode* root;
	printf("请输入结点数值:(输入00代表空结点)");
	scanf("%d", &data);
	if (data == 00)
		root = NULL;
	else
	{
		root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
		root->val = data;
		root->lchild = createBiTree();
		root->rchild = createBiTree();
	}
	return root;
}

void printleaves(struct TreeNode* root)
{
	if (root == NULL)
		exit(0);
	if (root->lchild == NULL && root->rchild == NULL)
			printf("%d", root->val);//输出节点
	else
	{
		printleaves(root->lchild);//递归遍历左子树
		printleaves(root->rchild);//递归遍历右子树
	}
}

void menu(void)
{
	printf("\n*************************************\n");
	printf("\n*******   1---创建二叉树     ********\n");
	printf("\n*******   2---输出叶子结点   ********\n");
	printf("\n*************************************\n");
}

int main(void)
{
	struct TreeNode* root = NULL;
	menu();
	while (1)
	{
		int choice;
		printf("请选择功能:");
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			root = createBiTree();
			break;
		case 2:
			printf("叶子结点为:");
			printleaves(root);
			printf("\n");
			break;
		}
	}
	return 0;
}

 

五、运行结果:

六、建树

      通过递归的方式,先输入当前结点的数值,如果为00则说明当前结点为空,返回NULL;否则申请一个结点,并将输入的数值赋值给该结点,然后递归创建其左右子树,先创建左子树,再创建右子树,并将左右子树的根节点分别赋值给该结点的左右指针。最终成功构造二叉树,返回根节点。

七、输出叶子节点

      先序遍历进行查找和输出。在遍历到每个节点时,如果该节点左节点和右节点都为空,则说明该节点是叶子节点,输出其值。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值