目录
前言
一、节点个数
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;
}
判断是否为完全二叉树,就需要知道这个二叉树是否符合要求,除了最后一层的节点外,以上的每一层都需要满节点,最后一层的节点要按照按照从左到右的顺序。
这里用到队列,先让根节点入队,记录根节点,让根节点出队,再让根节点的左右节点入队,再重复上述操作,直到遇到空节点,出循环后,如果队列为空就说明是完全二叉树,因为这个时候就说明每个节点都是按顺序依次排下来的,否则就不是完全二叉树。
本篇内容就到这里了,链式二叉树的实现也还完成了,希望对各位有帮助,如果有错误欢迎指出。