数据结构:链式二叉树(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;
}

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

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


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

相关推荐
dundunmm7 分钟前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神7 分钟前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做8 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Noah_aa19 分钟前
代码随想录算法训练营第五十六天 | 图 | 拓扑排序(BFS)
数据结构
KpLn_HJL1 小时前
leetcode - 2139. Minimum Moves to Reach Target Score
java·数据结构·leetcode
程序员老冯头2 小时前
第十五章 C++ 数组
开发语言·c++·算法
AC使者7 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp7 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
无 证明7 小时前
new 分配空间;引用
数据结构·c++
xiaoshiguang311 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode