数据结构:链式二叉树(2)

目录

前言

一、节点个数

[1.1 二叉树的节点个数](#1.1 二叉树的节点个数)

[1.2 二叉树叶子节点个数](#1.2 二叉树叶子节点个数)

[1.3 二叉树第k层节点个数](#1.3 二叉树第k层节点个数)

二、查找值为x的节点

三、判断二叉树是否为完全二叉树


前言

上一篇链式二叉树(1),主要是讲了了一些链式二叉树的实现基础以及链式二叉树的遍历,本篇将会将上一篇没完成的实现内容继续完成。

这里还是把实现链式二叉树的头文件放了过来

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate();
// 二叉树销毁
void BinaryTreeDestory(BTNode** root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root);

因为上一篇已经把链式二叉树的遍历讲完了,这里就暂时把它们去掉了。

一、节点个数

1.1 二叉树的节点个数

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

还是用递归解决,把左右子树都遍历一遍,最后再加上最上层的根节点就可以得出二叉树的节点个数。

1.2 二叉树叶子节点个数

int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->left == NULL&&root->right==NULL)
		return 1;
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

在前面的基础知识中讲过叶子结点就是度为0的节点,通过判断该节点是否有左右孩子来记录叶子节点个数,同样是把左右子树都遍历一遍。

1.3 二叉树第k层节点个数

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
		return  0;
	if (k == 1)
		return 1;
	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}

从最上层节点出发,通过遍历到这k层开始记录返回,如果只在第一层就直接返回1就行了。

二、查找值为x的节点

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;

	if (BinaryTreeFind(root->left, x) != NULL)
		return BinaryTreeFind(root->left, x);
	else if(BinaryTreeFind(root->right, x) != NULL)
		return BinaryTreeFind(root->right, x);
	else
	{
		printf("没找到该值的节点");
		return NULL;
	}
}

也是涉及遍历,递归,直到找到值为x的节点,这几个链式二叉树功能的实现基本都是涉及递归和遍历。

三、判断二叉树是否为完全二叉树

首先我们先回顾一下完全二叉树的知识

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树。

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。

要实现这个功能需要用到队列的函数实现(数据结构:队列

bool BinaryTreeComplete(BTNode* root)
{
	Queue a;
	QueueInit(&a);
	if (root)
		QueuePush(&a, root);
	while (!QueueEmpty(&a))
	{
		BTNode* f = QueueFront(&a);
		if (f == NULL)
			break;
		QueuePop(&a);
		QueuePush(&a, f->left);
	    QueuePush(&a, f->right);
	}
	if (!QueueEmpty(&a))
	{
		QueueDestroy(&a);
		return false;
	}
	QueueDestroy(&a);
	return true;
}

判断是否为完全二叉树,就需要知道这个二叉树是否符合要求,除了最后一层的节点外,以上的每一层都需要满节点,最后一层的节点要按照按照从左到右的顺序。

这里用到队列,先让根节点入队,记录根节点,让根节点出队,再让根节点的左右节点入队,再重复上述操作,直到遇到空节点,出循环后,如果队列为空就说明是完全二叉树,因为这个时候就说明每个节点都是按顺序依次排下来的,否则就不是完全二叉树。


本篇内容就到这里了,链式二叉树的实现也还完成了,希望对各位有帮助,如果有错误欢迎指出。

相关推荐
爱吃生蚝的于勒2 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~5 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^31 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城33 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120081 小时前
初三数学,最优解问题
算法
一直学习永不止步1 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
小刘|2 小时前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou2 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计