網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
題目難度:簡(jiǎn)單
一、題目描述
給你兩棵二叉樹(shù)的根節(jié)點(diǎn) p 和 q ,編寫(xiě)一個(gè)函數(shù)來(lái)檢驗(yàn)這兩棵樹(shù)是否相同。
如果兩個(gè)樹(shù)在結(jié)構(gòu)上相同,并且節(jié)點(diǎn)具有相同的值,則認(rèn)為它們是相同的。
LeetCode鏈接:相同的樹(shù)
二、解題思路
核心思路:
先比較兩顆二叉樹(shù)的根節(jié)點(diǎn)
- 如果「都為空」,則返回 true,說(shuō)明兩樹(shù)相同。
- 如果「一個(gè)為空一個(gè)不為空」,說(shuō)明這兩顆樹(shù)不相同,則返回 false。
- 如果「都不為空,但節(jié)點(diǎn)值不相同」,說(shuō)明這兩顆樹(shù)不相同,則返回 false。
- 經(jīng)過(guò) 1 和 2 和 3 的判斷,說(shuō)明根節(jié)點(diǎn)「都不為空,但節(jié)點(diǎn)值相同」,則當(dāng)前節(jié)點(diǎn)相同。我們繼續(xù)遞歸遍歷,比較它的左子樹(shù)和右子樹(shù)的根節(jié)點(diǎn)。
遞歸過(guò)程演示:
依次比較兩顆二叉樹(shù)中「當(dāng)前樹(shù)(1、2、3、4、5、6)的根節(jié)點(diǎn)」是否相等,這樣每個(gè)節(jié)點(diǎn)都被比較了一次。
/**
* 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. 先比較兩顆樹(shù)的根節(jié)點(diǎn)
// 都為空,返回true,說(shuō)明滿足相同的樹(shù)的條件
if(p == NULL && q == NULL)
{
return true;
}
// 一個(gè)為空一個(gè)不為空,返回false
if(p == NULL || q == NULL)
{
return false;
}
// 都不為空,但節(jié)點(diǎn)值不相等,返回false
if(p->val != q->val)
{
return false;
}
// 2. 經(jīng)過(guò)前面的if的判斷,既然運(yùn)行到這里了,說(shuō)明當(dāng)前節(jié)點(diǎn)相等
// 則繼續(xù)比較左子樹(shù)和右子樹(shù)的根節(jié)點(diǎn)
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
時(shí)間復(fù)雜度:假設(shè)兩棵樹(shù)都有 n 個(gè)節(jié)點(diǎn),最多比較 n 次,所以為 O ( N ) O(N) O(N)
空間復(fù)雜度:往下遞歸會(huì)開(kāi)辟棧幀空間,函數(shù)返回時(shí)會(huì)還給操作系統(tǒng),所以「空間復(fù)雜度」和「遞歸的最大深度」有關(guān),最壞情況下,「遞歸的最大深度」就是有 n 的節(jié)點(diǎn)二叉樹(shù)的最大深度,所以為 O ( N ) O(N) O(N)
- 最大深度: 此樹(shù)為單邊樹(shù),則深度為 n,最多向下創(chuàng)建 n 個(gè)棧幀,因?yàn)闂瑫?huì)邊用邊銷毀
- 最小深度: 此樹(shù)為完全二叉樹(shù)/滿二叉樹(shù),則深度為 log2(N+1)
原文鏈接:https://blog.csdn.net/weixin_48025315/article/details/123274275
相關(guān)推薦
- 2022-02-25 Oracle?觸發(fā)器實(shí)現(xiàn)主鍵自增效果_oracle
- 2022-05-08 一篇文章詳細(xì)解釋C++的友元(friend)_C 語(yǔ)言
- 2023-04-10 Android序列化接口Parcelable與Serializable接口對(duì)比_Android
- 2022-10-25 laravel-admin對(duì)表單的radio屬性無(wú)法進(jìn)行rule(‘required‘)驗(yàn)證
- 2022-06-30 C語(yǔ)言從基礎(chǔ)到進(jìn)階全面講解數(shù)組_C 語(yǔ)言
- 2022-12-02 React函數(shù)式組件Hook中的useEffect函數(shù)的詳細(xì)解析_React
- 2022-04-15 ASP.NET?Core基礎(chǔ)之Startup類_基礎(chǔ)應(yīng)用
- 2022-06-06 Python字符串常規(guī)操作小結(jié)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支