目录
1.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
前言
二叉树是一种非常重要的数据结构,广泛应用于计算机科学中,如表达式求值、排序、查找等领域。
一、二叉树的基本概念
二叉树(Binary Tree)是由节点组成的树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树有以下几种基本类型:
- 完全二叉树:除最底层外,其他层的节点数都达到最大,且最底层节点都集中在最左边。
- 满二叉树:每个节点都有两个子节点,且所有叶子节点都在同一层。
- 平衡二叉树:任何节点的左右子树高度差不超过 1 的二叉树。
二、二叉树的基本操作
在二叉树中,常见的操作包括:
1.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{
if (*(a + *pi) == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
if (root == NULL)
{
perror("root");
return NULL;
}
root->data = *(a + *pi);
(*pi)++;
root->left = BinaryTreeCreate(a, n, pi);
root->right = BinaryTreeCreate(a, n, pi);
return root;
}
2.二叉树销毁
void BinaryTreeDestory(BTNode** root)
{
if (*root == NULL)
{
return;
}
BinaryTreeDestory(&(*root)->left);
BinaryTreeDestory(&(*root)->right);
free(*root);
*root = NULL;
}
3.二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
return 0;
return BinaryTreeSize(root->left)+ BinaryTreeSize(root->right) + 1;
}
4.二叉树叶子节点个数
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);
return 0;
}
5.二叉树第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);
}
6.二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
return NULL;
if (root->data== x)
return root;
BTNode* ret = BinaryTreeFind(root->left, x);
if (ret!=NULL && ret->data == x)
{
return ret;
}
ret = BinaryTreeFind(root->right, x);
if (ret != NULL && ret->data == x)
{
return ret;
}
return NULL;
}
7.遍历操作:对树中的所有节点进行访问。常见的遍历方式有:
前序遍历:根节点 -> 左子树 -> 右子树
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%c ", root->data);
BinaryTreePrevOrder(root->left);
BinaryTreePrevOrder(root->right);
}
中序遍历:左子树 -> 根节点 -> 右子树
-
void BinaryTreeInOrder(BTNode* root) { if (root == NULL) { printf("NULL "); return; } BinaryTreePrevOrder(root->left); printf("%c ", root->data); BinaryTreePrevOrder(root->right); }
后序遍历:左子树 -> 右子树 -> 根节点
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
BinaryTreePrevOrder(root->left);
BinaryTreePrevOrder(root->right);
printf("%c ", root->data);
}
层序遍历:逐层从上到下、从左到右遍历节点。
void BinaryTreeLevelOrder(BTNode* root)
{
Que q;
QueueInit(&q);
if (root)
QueuePush(&q, root);
while (!QueueEmpty(&q))
{
BTNode* front = QueueTop(&q);
QueuePop(&q);
printf("%c ", front->data);
if(front->left)
QueuePush(&q, front->left);
if (front->right)
QueuePush(&q, front->right);
}
QueueDestroy(&q);
}
8.判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root)
{
Que q;
QueueInit(&q);
if(root)
QueuePush(&q,root);
while (!QueueEmpty(&q))
{
BTNode* front = QueueTop(&q);
QueuePop(&q);
if(front != NULL)
{
QueuePush(&q, front->left);
QueuePush(&q, front->right);
}
else
{
break;
}
}
while (!QueueEmpty(&q))
{
BTNode* front = QueueTop(&q);
if (front == NULL)
{
QueuePop(&q);
}
else
{
QueueDestroy(&q);
return 1;
}
}
QueueDestroy(&q);
return 0;
}
总结
二叉树是一种高效且常用的数据结构,它能够快速查找、插入和删除元素。通过 C 语言实现二叉树操作,能够帮助我们深入理解树形结构的运作原理,并为解决复杂问题提供有力支持。本文介绍了二叉树的基本操作和实现方式,读者可以在此基础上扩展更多功能,如平衡树的实现、树的可视化等。