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

目录

前言

一、节点个数

1.1 二叉树的节点个数

1.2 二叉树叶子节点个数

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

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

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


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

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值