如何完美吃下二叉树?——二叉树练习题

文章目录

  • 开胃前菜 基础概念选择题
  • 主菜 二叉树oj题
    • 1.单值二叉树
      • 题目
      • 思路1+代码
      • 思路2+代码
      • 递归展开图
    • 2. 检查两颗树是否相同
      • 题目
      • 代码
    • 3. 对称二叉树
      • 题目
      • 思路+代码
    • 4. 二叉树的前序遍历
      • 题目
      • 代码
    • 5. 另一颗树的子树
      • 思路+代码
    • 6.二叉树遍历
      • 题目
      • 代码
    • 7.二叉树的层序遍历
      • 准备环节
      • 代码实现
    • 8.判断二叉树是否是完全二叉树
      • 思路+代码

开胃前菜 基础概念选择题

  1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
    A 不存在这样的二叉树
    B 200
    C 198
    D 199

度为0的比度为2的永远多一个(任何二叉树都满足)
叶子结点的度为0,所以:199+1

  1. 下列数据结构中,不适合采用顺序存储结构的是( )
    A 非完全二叉树
    B 堆
    C 队列
    D 栈

  2. 在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
    A n
    B n+1
    C n-1
    D n/2

n0+n2+n1 = 2n
n0+n0-1+n1 = 2n
2*n0-1+n1 = 2n
n1是0或者1,这里n1只能是1,不然算出的是小数

  1. 一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
    A 11
    B 10
    C 8
    D 12

高度为h的完全二叉树,节点范围是:[2(h-1),2h-1]
这里算的是下限

  1. 一个具有767个节点的完全二叉树,其叶子节点个数为()
    A 383
    B 384
    C 385
    D 386

n0+n2+n1 = 767
n0+n0-1+n1 = 767
2*n0-1+n1 = 767
n1是0或者1,但这里767是一个奇数所以n1只能取0


 

主菜 二叉树oj题

1.单值二叉树

题目

LeetCode

在这里插入图片描述
 

思路1+代码

遍历,拿一个基准值去和树里的每一个值去比较

bool flag = true;
void PreOrderCompare(struct TreeNode* root, int val)
{if (root == NULL || flag == false)return;if (root->val != val){flag = false;return;}PreOrderCompare(root->left, val);PreOrderCompare(root->right, val);
}bool isUnivalTree(struct TreeNode* root){`在这里插入代码片`if (root == NULL)return true;flag = true;PreOrderCompare(root, root->val);return flag;
}

 

思路2+代码

分别用每个结点与他们的孩子相比较

bool isUnivalTree(struct TreeNode* root){if (root == NULL)return true;if (root->left && root->left->val != root->val)return false;if (root->right && root->right->val != root->val)return false;//递归 return isUnivalTree(root->left) && isUnivalTree(root->right);
}

 

递归展开图

在这里插入图片描述
注意:递归中返回不是直接返回到最外面,是返回上一层
 

2. 检查两颗树是否相同

题目

LeetCode
在这里插入图片描述
 

代码

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)return false;//递归return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);}

 

3. 对称二叉树

题目

LeetCode
在这里插入图片描述
 

思路+代码

bool isSymmetricSubTree(struct TreeNode* root1, struct TreeNode* root2)
{if(root1 == NULL && root2 == NULL)return true;if(root1 == NULL || root2 == NULL)return false;if(root1->val != root2->val)return false;return isSymmetricSubTree(root1->left,root2->right) && isSymmetricSubTree(root1->right,root2->left);}bool isSymmetric(struct TreeNode* root){if(root == NULL)return true;return isSymmetricSubTree(root->left,root->right);
}

 

4. 二叉树的前序遍历

题目

LeetCode
在这里插入图片描述

代码

int TreeSize(struct TreeNode* root){return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;}void preorder(struct TreeNode* root,int* a,int* pi){if(root == NULL)return;a[(*pi)++] = root->val;preorder(root->left,a,pi);preorder(root->right,a,pi); }int* preorderTraversal(struct TreeNode* root, int* returnSize){*returnSize = TreeSize(root);int* a = (int*)malloc(*returnSize * sizeof(int));int i  = 0;preorder(root,a,&i);return a;}

 

5. 另一颗树的子树

LeetCode
有点难度
在这里插入图片描述
 

思路+代码

把原树中所有子树都找出来与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)return false;//递归return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){if(root == NULL)return false;//遍历,跟root中所有子树都比较一遍
if(isSameTree(root,subRoot))
return true;return  isSubtree(root->left,subRoot)|| isSubtree(root->right,subRoot);}

 

6.二叉树遍历

题目

遍历
在这里插入图片描述
 

代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef char BTDataType;
typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDataType data;}BTNode;BTNode* BuyNode(BTDataType x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));assert(node);node->data = x;node->left = NULL;node->right = NULL;return node;
}BTNode* CreateTree(char* str,int* pi)
{if(str[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = BuyNode(str[(*pi)++]);root->left = CreateTree(str,pi);root->right = CreateTree(str,pi);return root;
}void InOrder(BTNode* root)
{if(root == NULL)return;InOrder(root->left);printf("%c ",root->data);InOrder(root->right);
}int main()
{
char str[100];scanf("%s",str);int i = 0;BTNode* root = CreateTree(str, &i);InOrder(root);return 0;}

 

7.二叉树的层序遍历

准备环节

层序遍历需要用到队列,可以找之前写过的队列代码拷贝一份,添加现有项
包含一下队列的头文件就可以使用了

但有个小问题: 之前队列里面的数据类型是整数,层数遍历里面存的是结点(结构体)
所以得把typedef int* QDataType; 整型
改为typedef BTNode* QDataType; 结点

如果报错还得在typedef之前加一个前置声明
struct BinaryTreeNode;
 

代码实现

void leveIOrder(BTNode* root)
{Queue q;QueueInit(&q);if(root){QueuePush(&q,root);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);printf("%d ",front->data);QueuePop(&q);if(front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q,front->right);}}printf("\n");QueueDestroy(&q);
}

 

8.判断二叉树是否是完全二叉树

思路+代码

用层序遍历的方法最简单


int BinaryTreeComplete(BTNode* root);
{Queue q;QueueInit(&q);if(root){QueuePush(&q,root);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);printf("%d ",front->data);QueuePop(&q);if(front){QueuePush(&q, front->left);QueuePush(&q,front->right);}else{//遇到null以后就跳出break;}}//如果后面全是null,则是完全二叉树//如果null后面还有非空,则不是完全二叉树while(!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front){ QueueDestroy(&q); return false;}}  QueueDestroy(&q); return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26536.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动物园游记

这是学习笔记的第 1887 篇文章 今天本来打算去科技馆&#xff0c;结果发现就今天闭馆&#xff0c;真是不巧&#xff0c;于是改换了方向去了北京动物园。 早两年说动物园&#xff0c;基本都和服装批发能联系起来&#xff0c;我是纯粹的去看动物的。确切的说是陪孩子去看动物的。…

【Java核心技术卷】I/O详析

文章目录 概述Java io基本概念关于流流的分类 Java io框架一、以字节为单位的输出流的框架图&#xff08;1&#xff09;框架图图示&#xff08;2&#xff09;OutputStream详解&#xff08;3&#xff09;OutputStream子类&#xff08;4&#xff09;引申&#xff1a;打印流 二、以…

深圳-上海-呼伦贝尔-漠河-哈尔滨环行手记

C语言的精髓是指针&#xff0c;这是手艺人的小幸运&#xff0c;但这是程序员的悲哀。 今年&#xff08;2018年春节前&#xff09;的假期比较特殊&#xff0c;我这一出去就是20多天&#xff0c;请了十来天的年假…1月27号就出发离开深圳了&#xff0c;考虑到1月25号和1月26号两天…

魔幻的2020,对我来说却是逐渐觉醒的一年

2020年的最后一天&#xff0c;按照惯例总结一下成果&#xff0c;同时也制定一下来年的目标&#xff0c;每年不总得给自己立几个flag。 关于公众号 先说公众号&#xff0c;其实开通了很多年&#xff0c;直到今天&#xff0c;还差一百多粉丝才突破一万&#xff0c;这样的成绩算…

美团 大规模商品知识图谱的构建与应用

作者 | 曹雪智博士 美团 技术专家 来源 | DataFunTalk 在互联网新零售的大背景下&#xff0c;商品知识图谱作为新零售行业数字化的基石&#xff0c;提供了对于商品相关内容的立体化、智能化、常识化的理解&#xff0c;对上层业务的落地起到了至关重要的作用。 相比于美团大脑中…

连投两笔,低温预制烤肠为何成为小红书的“心头爱”?

近年来&#xff0c;随着人们生活水平的不断提高和生活节奏的加快&#xff0c;消费者的食品消费观念已经从最初的满足于温饱发展成为追求高品质的消费&#xff0c;对食品健康、质量和用餐效率等提出新要求&#xff0c;低温预制食品的需求不断提升。 根据 Frost & Sullivan&…

基于JAVA的网上水果生鲜超市商城SSM【数据库设计、论文、源码、开题报告】

叿狆号:“IT软件学习社” 主要使用技术 springspringmvcmybatisjspmysqltomcat 功能介绍 &#xff08;1&#xff09;登录注册功能&#xff1a;用户打开系统&#xff0c;浏览挑选生鲜&#xff0c;在购买生鲜之前&#xff0c;要进行注册登录&#xff0c;保证一人一个账号&…

路边2元一根的烤肠,里面究竟是什么肉?

放学之后&#xff0c;下班之余&#xff0c;大家有没有被路边滩上红彤彤、2元一根的烤肠&#xff08;热狗&#xff09;所吸引&#xff1f;那个扑鼻香味&#xff0c;能让你瞬间流口水有没有&#xff1f; 可是&#xff0c;单纯的你有没有想过&#xff0c;这些看上去就很美味的烤肠…

泰酷辣!有人把 81 个国内大模型汇总在一张图里!

在科技的世界里&#xff0c;一场革命正在悄然进行。这场革命的主角&#xff0c;就是我们今天要讲的“大模型”。这些大模型&#xff0c;就像一群巨人&#xff0c;正在各个领域中挥舞着他们的力量&#xff0c;引领着一场前所未有的技术变革。 在国内&#xff0c;这场大模型的研发…

Python 吞噬世界,GPT 吞噬 Python!ChatGPT 上线最强应用:分析数据、生成代码都精通

当地 7 月 7 日&#xff0c;OpenAI 在社交平台表示&#xff0c;将向所有 ChatGPT Plus 用户开放代码解析器&#xff08;Code Interpreter&#xff09;功能。消息一出便瞬间引发了开发者们的广泛关注&#xff0c;该功能被有的开发者认为是自 OpenAI 发布 GPT-4 以来最强大的功能…

GPT-4 终于开放了!

2023年&#xff0c;OpenAI的ChatGPT已经成为了一个不可忽视的存在。作为一种基于GPT模型的聊天机器人&#xff0c;ChatGPT在过去的一年多时间里里取得了令人瞩目的进步。从最初的简单问答&#xff0c;到现在能够进行深度对话&#xff0c;甚至可以执行代码&#xff0c;ChatGPT的…

draw.io和plantuml替代visio画图工具

目录 1.drawio <1>.Chrome plugin <2>.网址访问 <3>.draw.io快捷键 2.plantuml开源工具 <1>.网址 1.drawio <1>.Chrome plugin name&#xff1a;Diagrams for Confluence 跨平台&#xff0c;免费,在线画图。替代visio。<2>.网址访…

如何将simulink的图像导出到VISIO中

平时&#xff0c;我们在Simulink中获得的图像&#xff0c;有时需要进行修改&#xff0c;或者说图像大小比较大&#xff0c;在Simulink中操作起来比较卡。这时我们就需要将Simulink的图像导出出到Visio中。 首先&#xff0c;通过仿真&#xff0c;得到SCOPE图像&#xff0c;打开…

Visio画代码调用图

为什么一定要用上面的这个基本形状&#xff1f;而不是自己拖一个长方形出来&#xff1f;接下来就显示出优势了&#xff0c;可以很方便地连接在中点处&#xff0c;强迫症友好。 如果用长方形&#xff0c;就不能很准确地连接。 画起来真的很需要耐心&#xff0c;我放弃了 成品…

关于visio的使用

1、visio在画流程图中&#xff0c;对开发者帮助很大&#xff0c;特别是在写程序都要进行程序流程图 新建一个流程图进行绘画 2、根据流程图选择需要的款图 3.选择上面的填充使得矩形框变为白色&#xff0c;然后在里面打字 . 4、对图形进行拖动&#xff0c;出现竖直的线&#…

用了diagrams后我完全和visio说拜拜了

本文主要mark今天发现的一个可以替代visio绘图神器&#xff1a;diagram官方github下载链接 下面开始吐槽visio的缺点&#xff1a; 写论文的时候一定会遇到画系统框图、技术路线图这样的专业绘图&#xff0c;传统的方法是使用微软的visio&#xff0c;然而在使用过程中会遇到以…

DIgSILENT出图到Matlab画图到Visio画图全过程

许多人好奇&#xff0c;为什么别人的文章里画出的图又好看又整齐&#xff0c;而仿真软件直接导出的图&#xff0c;看起来很细&#xff0c;像个截图&#xff0c;这篇文章就要教你如何画出好看的仿真图。 DIgSILENT出图&#xff1a; 首先打开数据管理器&#xff0c;激活一个系统…

在LaTeX中添加Visio绘图

在LaTeX中添加Visio绘图 问题描述绘制图像调整边界Bonus&#xff1a;调整出血位打开开发工具选项卡调整出血位 保存为pdf插入LaTeX 问题描述 偶然得知9102年居然还有很多人依然在执行类似于Visio绘图-生成pdf文件-裁剪pdf-添加到LaTeX这样的工作流程&#xff0c;简直不能忍&am…

visio绘图小技巧

1.如何在图框的任意位置添加点&#xff1f; 先选中x点指令&#xff0c;再按住ctrl键&#xff0c;即可在任意位置画点 2.如何画出锯齿形线段&#xff1f; visio里面好像没有现成的锯齿形线段&#xff0c;所以可以利用直线反复折画&#xff0c;但是这里有个小技巧&#xff0c;就…

【软件工具使用】高效使用 Visio 绘图

文章目录 常用的形状添加基本形状添加连接符添加别人的形状库添加程序流程图形状添加乘法器、加法器形状添加 常用操作技巧网格打开与关闭&#xff1a;视图 -> 网格线条添加箭头线条添加字符&#xff0c;设置距离形状背景色更改取消线条自动对齐到中心的设置多个线条设置间隔…