二叉树是树最为基础的树,当然他没有《增删查改》因为既然增删查改为啥不用链表而用如此复杂的树呢?那学二叉树有什么用呢?好吧学他是为了为以后的红黑树和AVl树做基础。
在写代码之前我们要理解什么是树?什么是二叉树?
二叉树最🔥的无非是下面这幅图了吧
这张图在数据结构中就是二叉树,非洲二叉树,关于非洲是人类的起源从这我有点信了🤔
有一个根下面就是分支,二叉树特别吧仅且只有两个分支。
在正式上代码之前必须要理解一些基本的概念(让人工智能来回答一下kimi)
1.度是什么,叶节点是什么
该人工智能未能回答我所有,节点的度是根的子枝在二叉树中有0.1.2
2.为了最好理解,让人工智障出一下题
wc一上来就这难度算了还是根据航哥的来吧
记住这一特性:度为2的节点=度为0的节点-1 记住就行看图分西一下就能得出
为了方便做这类题,二叉树有一下性质
1.规定头节点层数为1,那么第i层有2^(i-1)个节点。
2.深度为h,最大节点数为2^h-1
3.度为2的节点与度为0的叶子节点的关系:度为2的节点=度为0的节点-1
4.N个节点的满二叉树深度为:h=logN
在做第二题要明白什么是满二叉树:每个根都有两个枝,且每一层都填满
1
/ \
2 3
/ \ / \
4 5 6 7
那么完全二叉树是什么呢?最后一层可能不会都填满,且满二叉树是完全二叉树的一个特殊情况
1
/ \
2 3
/ \ / \
4 5 6 7
/ \
8 9
第二题的答案是A即n: 在完全二叉树中度有三种情况0,1,2 设度为0的为a 度为1的为b,度为2的为c
所以a+b+c= 2n又因为性质原因,a-1=b 2a-1+b=2n 度为一的节点有1个或0个综合来只有1合适
第三题的答案是2^H-1-X=531 X是最后一层的缺失节点
接下来可以写代码了
二叉树大致代码知识分为三大模块
1.结构体模块
typedef struct TreeLeaft
{
int data;
// 根指向左边的指针
struct TreeLeaft left;
struct TreeLeaft right;
}TL;
2.主函数的编写(visual stdio2022)
3.前中后序的代码编写
//前序
void prevTreeLeaft(TL*root)
{
if(root==NULL)
{
printf("NULL");
return;
}
printf("%c",root->data);
prevTreeLeaft(root->left);
prevTreeLeaft(root->right);
}
前序中序和后续唯一的区别就是递归的顺序不同,如中序先是prevTreeLeaft(root->left) 再 printf("%c",root->data) 最后 prevTreeLeaft(root->right) 后序呢先是prevTreeLeaft(root->right)
再prevTreeLeaft(root->left)最后printf("%c",root->data)
4.求节点的个数。这里你可以用遍历的方法,也可以用分治在这里我将用分治简单的方法来解决
深度优先遍历
//求所有节点的数量
int TreeSize(TL*root)
{
return root==null?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
//求叶子节点的数量
int TreeLeaftSize(TL*root)
{
if(root==NULL)
{
return 0;
}
if(root->left==NULL&&root->right==NULL)
{
return 1;
}
return TreeLeaftSize(root->left)+TreeLeaftSize(root->right);
}
5.广度优先非递归
二叉树在力扣中会有很多题目,建议大家要做题二叉树才会记劳