目录
一、叶子节点
在树结构中,叶子节点(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;否则申请一个结点,并将输入的数值赋值给该结点,然后递归创建其左右子树,先创建左子树,再创建右子树,并将左右子树的根节点分别赋值给该结点的左右指针。最终成功构造二叉树,返回根节点。
七、输出叶子节点
先序遍历进行查找和输出。在遍历到每个节点时,如果该节点左节点和右节点都为空,则说明该节点是叶子节点,输出其值。