C語言詳解判斷相同樹案例分析
題目難度:簡單
一、題目描述
給你兩棵二叉樹的根節(jié)點 p 和 q ,編寫一個函數(shù)來檢驗這兩棵樹是否相同。
如果兩個樹在結(jié)構(gòu)上相同,并且節(jié)點具有相同的值,則認為它們是相同的。
LeetCode鏈接:相同的樹
二、解題思路
核心思路:
先比較兩顆二叉樹的根節(jié)點
- 如果「都為空」,則返回 true,說明兩樹相同。
- 如果「一個為空一個不為空」,說明這兩顆樹不相同,則返回 false。
- 如果「都不為空,但節(jié)點值不相同」,說明這兩顆樹不相同,則返回 false。
- 經(jīng)過 1 和 2 和 3 的判斷,說明根節(jié)點「都不為空,但節(jié)點值相同」,則當前節(jié)點相同。我們繼續(xù)遞歸遍歷,比較它的左子樹和右子樹的根節(jié)點。
遞歸過程演示:
依次比較兩顆二叉樹中「當前樹(1、2、3、4、5、6)的根節(jié)點」是否相等,這樣每個節(jié)點都被比較了一次。
/** * 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. 先比較兩顆樹的根節(jié)點 // 都為空,返回true,說明滿足相同的樹的條件 if(p == NULL && q == NULL) { return true; } // 一個為空一個不為空,返回false if(p == NULL || q == NULL) { return false; } // 都不為空,但節(jié)點值不相等,返回false if(p->val != q->val) { return false; } // 2. 經(jīng)過前面的if的判斷,既然運行到這里了,說明當前節(jié)點相等 // 則繼續(xù)比較左子樹和右子樹的根節(jié)點 return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); }
時間復雜度:假設兩棵樹都有 n 個節(jié)點,最多比較 n 次,所以為 O ( N ) O(N) O(N)
空間復雜度:往下遞歸會開辟棧幀空間,函數(shù)返回時會還給操作系統(tǒng),所以「空間復雜度」和「遞歸的最大深度」有關,最壞情況下,「遞歸的最大深度」就是有 n 的節(jié)點二叉樹的最大深度,所以為 O ( N ) O(N) O(N)
- 最大深度: 此樹為單邊樹,則深度為 n,最多向下創(chuàng)建 n 個棧幀,因為棧幀會邊用邊銷毀
- 最小深度: 此樹為完全二叉樹/滿二叉樹,則深度為 log2(N+1)
到此這篇關于C語言詳解判斷相同樹案例分析的文章就介紹到這了,更多相關C語言判斷相同樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用C語言求冪函數(shù)和指數(shù)函數(shù)的方法
這篇文章主要介紹了用C語言求冪函數(shù)和指數(shù)函數(shù)的方法,即pow()函數(shù)和sqrt()函數(shù)的使用,需要的朋友可以參考下2015-08-08c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)
這篇文章主要介紹了c++雙向鏈表操作示例,包括創(chuàng)建雙向鏈、刪除雙向鏈表、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等,需要的朋友可以參考下2014-05-05