既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
1.一些选择题
1.1
设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为( )个
A.11
B.12
C.13 √
D.14
设Ni表示度为i的节点个数,则节点总数 N = N0 + N1 + N2
节点个数于节点边的关系: N个节点的树有N-1个边
边与度的关系:N - 1 = N1 + 2 * N2
故:N0 + N1 + N2 - 1 = N1 + 2 * N2
因此,得:N0 = N2 + 1
回到原题,N0 = 3,N1 = 8,可得N2 = 2
因此答案是 3 + 8 + 2 = 13
1.2
有N个元素的完全二叉树的深度是()
答案:logN+1
高度为h的完全二叉树,节点个数在: 2^(h - 1) - 1 < n <= 2^h - 1
即log(n + 1) <= h < log(n + 1) + 1
这里需要注意的是n左右区间的开闭问题
完全二叉树最少的节点个数是2^(h - 1)-1+1
个,所以是n>2^(h - 1) - 1
1.3 由已知遍历序列画出原本树的结构
已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,则其前序遍历序列为( )
A.ABDGHJKCEFILM
B.ABDGJHKCEILMF √
C.ABDHKGJCEILMF
D.ABDGJHKCEIMLF
这道题我刚开始的思路是错的,因为我把它当作完全二叉树来看待,但题目并没有说它是完全二叉树
主要思路:可以从后续遍历确定根节点为A,中序遍历可以确定A的左右子树。再继续从后序遍历中确定A左右子树的根节点,依次往下判断
所以我画了一个分析图,如下👇
已知某二叉树的前序遍历序列为ABDEC,中序遍历序列为BDEAC,则该二叉树( )
A.是满二叉树
B.是完全二叉树,不是满二叉树
C.不是完全二叉树 √
D.是所有的结点都没有右子树的二叉树
这道题的思路和上一道题是一样的
已知某二叉树的前序遍历序列为5 7 4 9 6 2 1,中序遍历序列为4 7 5 6 9 1 2,则其后序遍历序列为( )
A.4 2 5 7 6 9 1
B.4 2 7 5 6 9 1
C.4 7 6 1 2 9 5 √
D.4 7 2 9 5 6 1
本题依旧和上面两道题思路相同!
1.4 单边树
一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足( )
A.所有的结点均无左孩子
B.所有的结点均无右孩子
C.只有一个叶子结点
D.至多只有一个结点
如果前序遍历和后序遍历序列正好相反,说明它是一个单边树,比如下面这前序和中序序列所构成的树的结构:
12345(纵向)
54321
对于单边树,只有一个叶子节点
1.5
20.如果一颗二叉树的前序遍历的结果是ABCD,则满足条件的不同的二叉树有( )种
A.13
B.14 √
C.15
D.16
首先这棵二叉树的高度一定在3~4层之间:
三层:
A(B(C,D),()), A((),B(C,D)), A(B(C,()),D), A(B((),C),D),
A(B,C(D,())), A(B,C((),D))
四层:
如果为四层,就是单边树,每一层只有一个节点,除过根节点,其他节点都有两种选择,在上层节点的左边还是右边,所以222共8种
总共为14种。
2.OJ题刷起来!
KY11 二叉树遍历
牛客网 KY11 二叉树遍历 👉传送门
这道题要求我们用先序遍历的操作从一个数组中读出一个树,并构建出树的基本结构,再用中序遍历的方式打印出这颗树
之前我们学习了前序遍历的操作,这里只需要把前序遍历中的printf操作改成构建新树即可
- 因为涉及道i的多次调用,所以函数中的i需要取地址,必须保证多次调用的i会同步++
- 构建完树的节点,并赋值后,需要递归构建左右子树,最后返回节点的地址
- 题目中的#代表NULL,直接return空即可
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char BTDataType;
typedef struct BTreeNode
{
BTDataType data;
struct BTreeNode\* left;
struct BTreeNode\* right;
}BTNode;
// 二叉树中序遍历
void BTreeInOrder(BTNode\* root)
{
if (root == NULL){
return ;
}
BTreeInOrder(root->left);
printf("%c ", root->data);
BTreeInOrder(root->right);
}
BTNode\* CreatTree(char \*arr,int\*i)
{
if (arr[\*i] == '#'){
(\*i)++;
return NULL;
}
BTNode\* newnode=(BTNode\*)malloc(sizeof(BTNode));
newnode->data=arr[(\*i)++];//i必须取地址
newnode->left=CreatTree(arr,i);//递归构建左子树
newnode->right=CreatTree(arr,i);//递归构建右子树
return newnode;
}
int main()
{
char arr[100];
scanf("%s",arr);
int i=0;
BTNode\* root=CreatTree(arr,&i);
BTreeInOrder(root);
return 0;
}
100 相同的树
leetcode:100. 相同的树
题目要求很简单,给定两颗树的根节点,要求我们判断这两棵树是否相同
- 如果两棵树都为空,树相同
- 如果其中一个为空,另外一个不为空,树不同
- 如果两个都不为空,但是节点值不相同,树不同
- 然后再递归判断左子树和右子树,将它们的结果与
&&
在一起,其中一个为假,返回假
bool isSameTree(struct TreeNode\* p, struct TreeNode\* q){
if(p==NULL&&q==NULL)//比较是否两个节点都为空,都为空是真
return true;
if(p==NULL||q==NULL)//如果有一个为空,另外一个非空,即为假
return false;
if(p->val!=q->val)//都不是空,判断val的值是否相等
return false;
//递归判断左子树和右子树是否相等
return isSameTree(p->left,q->left)
&& isSameTree(p->right,q->right);
}
学会这道题后,后面一些题目其实只需要把它的代码改一改就能用了😂
什么?你不信?那就看看下面这道题!
101 对称二叉树
leetcode:101. 对称二叉树
题目要求很简单哈,判断是不是两边对称的树
这和判断树相等有什么区别呢?不就是把左右子树的判断改一下就行了嘛?
直接调用上一题的代码!注意最后的return值,是p的左和q的右进行判断
bool \_isSameTree(struct TreeNode\* p, struct TreeNode\* q){
if(p==NULL&&q==NULL)//比较是否两个节点都为空,都为空是真
return true;
if(p==NULL||q==NULL)//如果有一个为空,另外一个非空,即为假
return false;
if(p->val!=q->val)//都不是空,判断val的值是否相等
return false;
//递归判断左子树和右子树是否对称相等
return \_isSameTree(p->left,q->right)
&& \_isSameTree(p->right,q->left);
}
bool isSymmetric(struct TreeNode\* root){
return \_isSameTree(root->left,root->right);
}
哈哈,是不是很爽,别急,后面还有可以偷懒的题目!
572 另外一棵树的子树
leetcode:572. 另一棵树的子树
这道题我们要判断一颗树是否为另外一棵树的子树,和判断一个字符串是不是另外一个字符串的子串很相似
其实只需要递归判断每一个节点的左右子树是否和subRoot
相同就可以了!
bool \_isSameTree(struct TreeNode\* p, struct TreeNode\* q){
if(p==NULL&&q==NULL)//比较是否两个节点都为空,都为空是真
return true;
if(p==NULL||q==NULL)//如果有一个为空,另外一个非空,即为假
return false;
if(p->val!=q->val)//都不是空,判断val的值是否相等
return false;
//递归判断左子树和右子树是否相等
return \_isSameTree(p->left,q->left)
&& \_isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode\* root, struct TreeNode\* subRoot){
// if(root==NULL&&subRoot==NULL)
// return true;
// if(root!=NULL&&subRoot==NULL)
// return true;
// 让isSametree函数来比较这俩个
if(root==NULL)
return false;
if(\_isSameTree(root,subRoot))
return true;
![img](https://img-blog.csdnimg.cn/img_convert/51b576064e5716d78bdedde0a5c7ad91.png)
![img](https://img-blog.csdnimg.cn/img_convert/5f29aa8c7dfb9bb3b24317780206ae92.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
return true;
// 让isSametree函数来比较这俩个
if(root==NULL)
return false;
if(\_isSameTree(root,subRoot))
return true;
[外链图片转存中...(img-bGCtJAXt-1715851338609)]
[外链图片转存中...(img-n1PjbmD4-1715851338609)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**