二叉树
二叉树概念:
一棵二叉树是结点的一个有限集合,该集合满足以下特征:
二叉树结构:
二叉树函数
创建二叉树
函数介绍:
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
- a,存储二叉树数据的数组
- n,数组数据的数量
- pi,标记,标记当前已入二叉树的数据数量
- 函数返回值类型BTNode*,指向根节点
int a[] = {1,2,3,-1,-1,-1,4,5,-1,-1,6};
- 数组a中为要入二叉树的数据,-1表示二叉树的节点为空
#define KONG -1
- 宏定义,用KONG来代替-1表示节点为空
函数分析:
通过前序遍历与递归创建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi){
//1、当数组访问越界,或者访问的数据为KONG时返回NULL,
if(*pi>=n||KONG==a[*pi]){
(*pi)++;//(*pi)++,若数据为KONG,数组下标加1,访问下一个数组数据
return NULL;//返回NULL,即,根节点的孩子指针链接NULL
}
//2、前序遍历、递归调用创建二叉树
BTNode* root = BuyNode(a[(*pi)++]); //创建根节点,(*pi)++,创建1个根节点后继续访问数组下一个数据
root->left = BinaryTreeCreate(a, n, pi); //遍历左孩子
root->right = BinaryTreeCreate(a, n, pi); //遍历右孩子
return root;
}
二叉树遍历
函数介绍:
void BinaryTreePrevOrder(BTNode* root)
- root、指向二叉树根节点的指针
函数分析:
前序遍历、中序遍历、后续遍历等遍历方式,通过递归访问节点并打印。
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root){
if (root){
printf("%d ",root->data );
BinaryTreePrevOrder(root->left);
BinaryTreePrevOrder(root->right);
}
}
二叉树节点个数
函数介绍:
int BinaryTreeSize(BTNode* root);
- root、指向二叉树根节点的指针
- 函数返回值类型int,返回整型数据,即有多少个节点
函数分析:
// 二叉树节点个数、递归调用思想
int BinaryTreeSize(BTNode* root){
//递归出口、当遇见空节点时,返回0
if (NULL == root){
return 0;
}
//若节点非空,则加1
return BinaryTreeSize(root->left ) + BinaryTreeSize(root->right ) + 1;
}
二叉树叶子节点个数
函数介绍:
int BinaryTreeLeafSize(BTNode* root)
- root、指向二叉树根节点的指针
- 函数返回值类型int,返回整型数据,即有多少个叶子节点
函数分析:
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root){
//1、若为空节点,则返回0
if (NULL == root){
return 0;
}
//2、若为叶子节点,返回1
if (NULL == root->left && NULL == root->right){
return 1;
}
//3、若为双亲节点,则直接检查其孩子
return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
二叉树的高度
函数介绍:
int BinaryHeight(BTNode* root);
- root、指向二叉树根节点的指针
- 函数返回值类型int,返回整型数据,即树的高度
函数分析:
/*
二叉树的高度
分为三个部分:根节点,左子树的高度、右子树的高度
*/
int BinaryHeight(BTNode* root){
if (NULL == root){
return 0;
}
int leftHeight = BinaryHeight(root->left);
int rightHeight = BinaryHeight(root->right );
return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;
}
二叉树第k层节点个数
函数介绍:
int BinaryTreeLevelKSize(BTNode* root, int k);
- root、指向二叉树根节点的指针
- k、二叉树的层次
- 函数返回值类型int,返回整型数据,即二叉树第k层有多少个节点
函数分析:
/*
二叉树第k层节点个数
本质上是递归到第k层的节点,节点数累加起来返回
*/
int BinaryTreeLevelKSize(BTNode* root, int k){
//1、若root为空、或k<=0,则返回0
if (NULL == root || k <= 0){
return 0;
}
//2、若k==1,返回1,即现在在底k层,递归调用,使第k层的每个节点返回1
if (1 == k){
return 1;
}
//3、第k层的每个节点返回1累加起来后返回
return BinaryTreeLevelKSize(root->left , k-1) + BinaryTreeLevelKSize(root->right , k-1);//此处建议用k-1,不要使用自减,因为访问左、右孩子,自减的话可能会使传过去的k的参数自减了2次
}
销毁二叉树
函数介绍:
void BinaryTreeDestory(BTNode** root)
- root、指向二叉树根节点的指针。
tip:
root为二级指针,这是因为释放空间后需要使指针指向空,即改变指针本身。
函数分析:
//销毁二叉树,后续遍历的思想
void BinaryTreeDestory(BTNode** root){
if (NULL == (*root)){
return;
}
BinaryTreeDestory(&((*root)->left));
BinaryTreeDestory(&((*root)->right));
free(*root);
*root = NULL;
}