二叉树刷题总结

news/2024/11/16 6:58:41/

题单:

 

 一,相同的树

题目:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

题目接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSameTree(struct TreeNode* p, struct TreeNode* q){}

分析:

要判断两棵树是否相同,首先就要判断根节点是否相同:

1.当两棵树的根节点都为NULL时返回true。

2.当两棵树的根节点一个为NULL一个不为NULL时返回false。

3.当两棵树根节点都不为NULL时并且节点的值不相等时返回false。

当根节点相同时,继续判断左右子树。左右子树都相同时返回true。

 解题代码:

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

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isUnivalTree(struct TreeNode* root){}

分析:

判断是否是单值二叉树关键就在于一整棵树的每一个节点的值都是一样的。所以我们需要将每一个节点的值与它们的根节点进行比较。当根节点没有左右节点时返回true,当根节点的左右节点与根节点的值不相同时返回false。

代码:

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

三,对称二叉树

题目:

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSymmetric(struct TreeNode* root){}

分析:

判断镜像二叉树:

1.当根节点为NULL时直接返回true表示这是一棵镜像二叉树

2.当根节点不为NULL时便对左右节点进行判断。

比如这棵树:

   1
   / \
  2   2
 / \ / \
3  4 4  3

这棵树的根节点不为NULL,所以我们便对左右节点进行判断,左右节点相同便对左的左与右的右,右的左与左的右进行判断。

代码:

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

四,二叉树的前序遍历

 题目:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* preorderTraversal(struct TreeNode* root, int* returnSize){}

分析:

二叉树的前序遍历是一个较为简单的题目,但是要注意的是当你在使用递归来做这道题时传的下标的地址而不能直接传指针的值。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/int numsSize(struct TreeNode* root)//计算节点数{if(root==NULL)return 0;return numsSize(root->left)+numsSize(root->right)+1;}void preorderTraversal_(int* a,int*numsSize,struct TreeNode* root)//实现前序遍历
{if(root == NULL)return ;a[(*numsSize)++] = root->val;preorderTraversal_(a,numsSize,root->left);preorderTraversal_(a,numsSize,root->right);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){int n = numsSize(root);//计算个数int* a =(int*) malloc(sizeof(int)*n);//malloc出来一个数组*returnSize = 0;preorderTraversal_(a,returnSize,root);//前序遍历return a;
}

五,二叉树的子树

题目:

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

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

接口:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){}

 分析:

寻找二叉树的子树。先写一个判断两棵树是否相同的数的函数,然后对判断从根节点处开始的树是否与子树相同。如果不同就比较左子树与右子树。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
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&&subRoot==NULL)return true;if(root==NULL||subRoot==NULL)return false;return  isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}


http://www.ppmy.cn/news/724910.html

相关文章

Linux——进程信号(上)

目录 前文 一,什么是进程信号 二,信号的产生 2.1 通过按键终端产生信号 2.2 调用系统函数向进程发信号 2.3 由软条件产生信号 2.4 硬件异常产生信号 总结 前文 上文主要讲了一下进程间用管道通信的相关知识,本文主要带领大家深度认识一…

手机号码归属地及运营商查询

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class NewMobile {public stati…

mysql手机号码规律查询

tips:所有手机号均为随机创建的,为了做查询的效果展示,不涉及他人隐私。 mysql手机号码规律查询 tips:所有手机号均为随机创建的,为了做查询的效果展示,不涉及他人隐私。数据库全号规律AAAABABAABBCCABCD(顺…

批量查询手机号码运营商信息

项目场景: 批量查询手机号码信息 问题描述: 有同事需要批量查询手机号码的运营商,归属地区号信息 思路: 百度搜索,爬虫取数,学的不精暂时还不会直接放弃python 自带一个phone库,缺点是查不到…

知识点速记 | 本机号码一键登录?

目录 中国移动 中国电信 很多 APP 的目前都支持「本机号码一键登录」功能。本机号码一键登录是基于运营商独有网关认证能力推出的账号认证产品。用户只需一键授权,即可实现以本机号码注册/登录,相比先前的短信验证码流程体验更优。 目前市面上有很多厂…

手机号码归属地查询 - 一刀工具

手机号码归属地快速查询移动,联通,电信手机号码归属地,免费手机号码运营商查询,手机归属地查询大全。 代码片段 //获取手机信息static function getMobile($mobile){try {$phone new PhoneHelper();$res $phone->setPhone($m…

JSP网上手机商城系统 用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上手机商城系统是一套完善的web设计系统,对理解JSP java SERLVET mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发,数据库为Mysql5.0&a…

如何快速查询手机号码归属地和运营商

最近公司项目需要做一个快速查询手机号码归属地和运营商的小功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的手机号码归属地和运营商查询API非常符合我的开发需求。 手…