C語(yǔ)言詳解判斷相同樹(shù)案例分析
題目難度:簡(jiǎn)單
一、題目描述
給你兩棵二叉樹(shù)的根節(jié)點(diǎn) p 和 q ,編寫一個(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)
到此這篇關(guān)于C語(yǔ)言詳解判斷相同樹(shù)案例分析的文章就介紹到這了,更多相關(guān)C語(yǔ)言判斷相同樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門實(shí)例
這篇文章主要介紹了C語(yǔ)言編程中實(shí)現(xiàn)二分查找的簡(jiǎn)單入門實(shí)例,需要的朋友可以參考下2015-12-12
基于Matlab實(shí)現(xiàn)離散系統(tǒng)分岔圖的繪制
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)離散分岔圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2022-04-04
C++ 流插入和流提取運(yùn)算符的重載的實(shí)現(xiàn)
這篇文章主要介紹了C++ 流插入和流提取運(yùn)算符的重載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
C++中實(shí)現(xiàn)WebSocket通信的兩種方法:libwebsockets庫(kù)、Boost.Beast?庫(kù)
C++中WebSocket庫(kù)主要有以下幾個(gè)?:cpp-websocket?、asio_websocket?、websockets++?、?websocketpp?、?libwebsockets?、?uWebSockets?、Boost.Beast?、Simple-WebSocket-Server?,這篇文章使用libwebsockets庫(kù)、Boost.Beast?庫(kù)來(lái)實(shí)現(xiàn)c++中的WebSocket通信2025-01-01
C語(yǔ)言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出
上期我們講完了排序算法下,不知道小伙伴們有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題,快速排序和歸并排序我們都是用遞歸來(lái)實(shí)現(xiàn)的,可能有小伙伴會(huì)問(wèn),如果說(shuō)數(shù)據(jù)量很多話,棧區(qū)空間會(huì)不會(huì)不夠用呢?這期我們就來(lái)解決使用遞歸實(shí)現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q2022-04-04

