【C语言】带你用偷懒的方式刷爆二叉树OJ题_设一棵有8个结点的二叉树,度数为1的结点有3个,则该树共有多少个结点,怎么算出

img
img

既有适合小白学习的零基础资料,也有适合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左右子树的根节点,依次往下判断

所以我画了一个分析图,如下👇

IMG_20220415_103954

已知某二叉树的前序遍历序列为ABDEC,中序遍历序列为BDEAC,则该二叉树( )
A.是满二叉树
B.是完全二叉树,不是满二叉树
C.不是完全二叉树   √
D.是所有的结点都没有右子树的二叉树

这道题的思路和上一道题是一样的

image-20220416163152483

已知某二叉树的前序遍历序列为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

本题依旧和上面两道题思路相同!

IMG_20220415_105012

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 二叉树遍历 👉传送门

image-20220416164513012

这道题要求我们用先序遍历的操作从一个数组中读出一个树,并构建出树的基本结构,再用中序遍历的方式打印出这颗树

之前我们学习了前序遍历的操作,这里只需要把前序遍历中的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. 相同的树

image-20220416165211195

题目要求很简单,给定两颗树的根节点,要求我们判断这两棵树是否相同

  • 如果两棵树都为空,树相同
  • 如果其中一个为空,另外一个不为空,树不同
  • 如果两个都不为空,但是节点值不相同,树不同
  • 然后再递归判断左子树和右子树,将它们的结果与&&在一起,其中一个为假,返回假
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);
}

image-20220416170618951

学会这道题后,后面一些题目其实只需要把它的代码改一改就能用了😂

什么?你不信?那就看看下面这道题!


101 对称二叉树

leetcode:101. 对称二叉树

image-20220416165729067

题目要求很简单哈,判断是不是两边对称的树

这和判断树相等有什么区别呢?不就是把左右子树的判断改一下就行了嘛?

直接调用上一题的代码!注意最后的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);
}

image-20220416170605085

哈哈,是不是很爽,别急,后面还有可以偷懒的题目!


572 另外一棵树的子树

leetcode:572. 另一棵树的子树

image-20220416170019257

这道题我们要判断一颗树是否为另外一棵树的子树,和判断一个字符串是不是另外一个字符串的子串很相似

其实只需要递归判断每一个节点的左右子树是否和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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值