多次在C站学习,现在我也终于要奉献出我的第一篇学习文章了!
这次要分享的是基于C语言的算法与数据结构中的二叉树相关知识点。
包括:
- 二叉树的创建与遍历
- 二叉树的四种统计算法
首先让我们来看初始化及创建、遍历算法
// An highlighted block
#include<stdio.h>
#include<stdlib.h>
typedef char ElementType;
typedef struct TNode *Position; /* 结构体指针 */
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */
ElementType Data; /* 结点数据 */
BinTree Left; /* 指向左子树 */
BinTree Right; /* 指向右子树 */
}TNode;
void CreateBinaryTree ( BinTree *T ) { /*用类似先序遍历的方法创建二叉树*/
ElementType ch;
scanf("%c",&ch);
if (ch == '#')
*T = NULL;
else {
*T = (BinTree)malloc(sizeof(TNode));
(*T)->Data = ch;
CreateBinaryTree(&((*T)->Left));
CreateBinaryTree(&((*T)->Right));
}
}
void PreOrderTraversal ( BinTree BT ) { /*先序遍历*/
if ( BT ) {
printf("%c", BT->Data);
PreOrderTraversal( BT->Left );
PreOrderTraversal( BT->Right );
}
}
void InOrderTraversal ( BinTree BT ) { /*中序遍历*/
if ( BT ) {
InOrderTraversal( BT->Left );
printf("%c", BT->Data);
InOrderTraversal( BT->Right );
}
}
void PostOrderTraversal ( BinTree BT ) { /*后序遍历*/
if ( BT ) {
PostOrderTraversal( BT->Left );
PostOrderTraversal( BT->Right );
printf("%c", BT->Data);
}
}
接下来是四种统计方法
int GetHeight(BinTree BT){ /*统计二叉树高度*/
int HL,HR,MaxH;
if(BT){
HL = GetHeight(BT->Left);
HR = GetHeight(BT->Right);
MaxH = HL > HR ? HL : HR;
return (MaxH+1);
}
else return 0;
}
int NodeCount(BinTree BT){ /*统计(所有)结点个数*/
int num = 0;
if(BT == NULL) return 0;
else if(BT->Left == NULL && BT->Right == NULL) return 1;
else {
num = NodeCount(BT->Left) + NodeCount(BT->Right);
return (num+1);
}
}
int LeafCount(BinTree BT){ /*统计叶子(最外圈结点)个数*/
int num = 0;
if(BT == NULL) return 0;
else if(BT->Left == NULL && BT->Right == NULL) return 1;
else {
num = LeafCount(BT->Left) + LeafCount(BT->Right);
return (num);
}
}
int FullNodeCount(BinTree BT){
int num;
if(BT == NULL||(BT->Left == NULL && BT->Right == NULL)) return 0;
else if(BT->Left == NULL && BT->Right != NULL) num = FullNodeCount(BT->Right);
else if(BT->Left != NULL && BT->Right == NULL) num = FullNodeCount(BT->Left);
else num = FullNodeCount(BT->Left) + FullNodeCount(BT->Right) + 1;
return num;
}
然后是main函数
int main() {
BinTree myTree;
printf("Create your Binary Tree:\n");
CreateBinaryTree(&myTree);
printf("\n PreOrder:");
PreOrderTraversal(myTree);
printf("\n InOrder:");
InOrderTraversal(myTree);
printf("\n PostOrder:");
PostOrderTraversal(myTree);
printf("\n The height of this tree is: %d",GetHeight(myTree));
printf("\n The amount of nodes on this tree is: %d",NodeCount(myTree));
printf("\n The amount of leaves on this tree is: %d",LeafCount(myTree));
printf("\n The amount of full nodes on this tree is: %d",FullNodeCount(myTree));
return 0;
}
最后是输入内容来测试程序
假设我们想得到以下二叉树:
那么根据先序遍历的顺序,我们应该输入内容:
FCA##DB###EH##GM###
并回车
得到以下结果:
经验证,与预期相符,程序一切正常!
假若你对输入内容有疑惑的话,建议看一下力扣出品的二叉树遍历图解!
当然,也欢迎在评论区与我激情讨论!
好了,这就是本次分享的全部内容了!
若你喜欢的话请给我点个赞,这样会对我起到非常积极的作用,让我产出更多学习内容!
(对了,我也在学习 Verilog HDL(基于VIVADO)
,若大家感兴趣,我也可以尝试分享一些相关内容!