二叉树刷题(1)

server/2024/9/23 9:25:25/

二叉树题目讲解(1)

  • 一、构建二叉树并且遍历
    • (1)思路
    • (2)代码
  • 二、对称二叉树
    • 1、思路
    • 2、代码
  • 三、相同的树
    • 1、思路
    • 2、代码
  • 四、单值二叉树
    • 1、思路
    • 2、代码
  • 五、另一棵树的子树
    • 1、思路
    • 2、代码

一、构建二叉树并且遍历

题目描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
示例:
输入:abc##de#g##f###

输出:c b e g d f a

(1)思路

1、首先读完题目我们需要明白题目的意思:
输入一串字符(前序遍历)根据我们的字符串构建我们的二叉树,然后再中序遍历
在这里插入图片描述
构建树的过程如图所示,先创建根节点,然后遍历左子树,然后右子树,所以建树的过程是递归的过程。

2、我们该如何实现呢?
(1)首先我们先创建一个字符数组将我们的字符串放入,因为是数组所以我们需要一个下标来访问我们的数组,但由于我们的建树过程是递归的,所以我们的下标需要在main函数里定义。
(2)然后就进入我们的建树函数里,结束条件是什么呢?大家想如果遇到空是不是就要返回到上一级,所以结束条件就是如果遇到‘#’就返回,并且由于这是在数组里,我们需要下标++。
(3)然后我们就可以开始我们的建根,如果当前数组元素不为“#”就创建根节点,
那根节点的左子树怎么办?那我们就递归,根的left就直接递归,右孩子同理。

这里体现了我么的分置的思想。

(2)代码

#include <stdio.h>
#include<string.h>typedef struct treenode
{char val;struct treenode*left;struct treenode*right;
}TNode;//定义树的节点TNode*createtree(char*arr,int*i)
{if(arr[*i]=='#')//如果当前节点为空就返回上一级{(*i)++;return NULL;}TNode*root=(TNode*)malloc(sizeof(TNode));//创建根节点root->val=arr[(*i)++];root->left=createtree(arr,i);//递归根的左子树root->right=createtree(arr,i);//递归根的右子树return root;//最后返回根节点即可
}
void midtravel(TNode*root)//中序遍历
{if(root==NULL)return;midtravel(root->left);printf("%c ",root->val);midtravel(root->right);
}
int main() {char arr[100];gets(arr);//得到我们的字符串int i=0;TNode*root=createtree(arr,&i);//为什么这里用i的地址//这是因为如果值传递在递归里我们加不上去midtravel(root);return 0;
}

二、对称二叉树

题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。
示例:
在这里插入图片描述

1、思路

这道题我们的思路是什么呢?

(1)首先我们需要明白什么样的树才是我们的对称二叉树,是不是左子树的左子树等于右子树的右子树,右子树的左子树等于左子树的右子树,那这里跟我们的根节点有关系吗?所以如果我们的根为空就返回true,如果不为空就进入判断左子树与右子树是否是镜像的。
(2)在函数里我们怎么实现呢?首先我们需要判断左子树与右子树是否都为空,如果都为空,那我们的树只有一个根节点,那就返回true,然后我们需要判断是否有一个子树为空,如果有的话那我们的树就不是镜像二叉树。
(3)上面完成以后我们的树就一定有两颗子树,但我们还没有比较它们的值是否相等,如果不相等就返回false,然后再比较左子树的左子树与右子树的右子树是否相等,再比较右子树的左子树是否与左子树的右子树相等即可

2、代码

bool _isSymmetric(struct TreeNode*p,struct TreeNode*q){if(p==NULL&&q==NULL)//如果左右子树都为空return true;if(p==NULL||q==NULL)//第一个if排除了两者都为空的情况,这里判断是否有一个不为空return false;if(p->val!=q->val)return false;return _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);}
bool isSymmetric(struct TreeNode* root){if(root==NULL)//如果根节点为空,就是空树return true;return _isSymmetric(root->left,root->right);
}

三、相同的树

题目描述
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例:
在这里插入图片描述

1、思路

在完成了上面的对称二叉树后这道题就简单很多嘛!
首先我们需要判断两棵树是否都为空以及一个不为空一个为空这两种情况,在判断完上面以后我们的两棵树一定都有根节点,然后我们判断根的值是否相等,最后遍历我们的左树的左树与右数的左树,左树的右树与右树的右树即可。

2、代码

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);
}

四、单值二叉树

题目描述:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
示例:
在这里插入图片描述

1、思路

这道题我们首先需要判断树是否为空,如果为空则返回true,如果不是空树,我们就比较左子树的值与根节点的值是否相等,再比较右子树的值与根节点是否相等,如果不相等则返回false,最后递归我们的左子树与右子树。
这里也走的我们的分治的思想。

2、代码

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

五、另一棵树的子树

题目描述:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例:
在这里插入图片描述

1、思路

这道题其实思路非常的简单,我们不是求是否为子树嘛,那我们可以走一个前序遍历,比较每一个节点作为树与右边的所求的子树,再走一个issametree即可。

2、代码

bool issametrue(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 issametrue(p->left,q->left)&&issametrue(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 false;if(issametrue(root,subRoot))return true;return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

http://www.ppmy.cn/server/105237.html

相关文章

数据之争:网络爬虫涉及的法律问题

在大数据时代&#xff0c;除直接通过用户采集之外&#xff0c;另一大数据来源就是使用网络爬虫采集公开信息。爬虫的使用到了何种程度&#xff1f;有业内人士称&#xff0c;互联网50%以上&#xff0c;甚至更高的流量其实都是爬虫贡献的。对某些热门网页&#xff0c;爬虫的访问量…

一文了解 Vue3 的 nextTick 大致信息

nextTick 是 Vue 3 中用于完成数据绑定和 DOM 更新后执行的方法&#xff0c;非常有用&#xff0c;也是 Vue 的一道比较常见的面试题。 1. 基本用法 nextTick 是一个异步方法&#xff0c;它允许我们在下一个 DOM 更新后执行回调函数。当更改了响应式数据并需要在更新后的 DOM …

python脚本:输入基因名,通过爬虫的方式获取染色体上的location。

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 python脚本&#xff1a;输入基因名&#xff0c;通过爬虫的方式获取染色体上的location。 def get_gene_location(gene_symbol):…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

【Python机器学习】NLP分词——词干还原的挑战

要想使用自然语言处理的相关应用&#xff0c;第一件事就是需要一个强大的词汇表。我们要把文档或任何字符串拆分为离散的有意义的词条&#xff0c;这里说的词条仅限于词、标点符号和数值&#xff0c;但是这里使用的技术可以很容易推广到字符序列包含的任何其他有意义的单元&…

Flask SQLALchemy 的使用

Flask SQLALchemy 的使用 安装 Flask-SQLAlchemy配置 Flask-SQLAlchemy定义模型创建数据库和表插入和查询数据更新和删除数据迁移数据库总结Flask-SQLAlchemy 是一个 Flask 扩展,它简化了 Flask 应用中 SQLAlchemy 的使用。SQLAlchemy 是一个强大的 SQL 工具包和对象关系映射(…

Kubernetes全名及其缩写K8S的正确读音

Kubernetes&#xff0c;在希腊语意为“舵手”或“驾驶员”&#xff0c;在IT技术领域&#xff0c;这是一个开源系统&#xff0c;支持部署、扩缩和管理容器化应用。正如船长负责船舶在海上的安全航行一样&#xff0c;Kubernetes担负着安全编排和运送容器&#xff08;可理解为船上…

XTuner微调个人小助手认知

1. 环境准备 将Tutorial仓库的资料克隆到本地 mkdir -p /root/InternLM/Tutorial git clone -b camp3 https://github.com/InternLM/Tutorial /root/InternLM/Tutorial 创建一个叫做demo的虚拟环境 # 创建虚拟环境 conda create -n demo python3.10 -y# 激活虚拟环境&…