力扣日常打卡 面試題04 10 檢查子樹

2021-10-07 20:52:37 字數 1474 閱讀 3531

題目描述:

檢查子樹。你有兩棵非常大的二叉樹:t1,有幾萬個節點;t2,有幾萬個節點。設計乙個演算法,判斷 t2 是否為 t1 的子樹。

如果 t1 有這麼乙個節點 n,其子樹與 t2 一模一樣,則 t2 為 t1 的子樹,也就是說,從節點 n 處把樹砍斷,得到的樹與 t2 完全相同。

示例:

思路與題解:

看到題目要求,這種包含關係,第一時間我想的是把二叉樹與字串進行轉換,然後判斷:

return

!(s1.

find

(s2)

==string::npos)

;

其中s1為t1樹中序遍歷的結果,s2為t2樹中序遍歷的結果,具體遍歷過程如下:

void

inorder

(treenode* node,string s)

但是,仔細一想,就發現其中的不對,居然力扣上還有人把它當作正確題解發了出來—錯誤**,我覺得更是大錯特錯!如果他能通過測試用例的話,只能說力扣的測試用例不嚴謹。舉兩個例子,對於下方的二叉樹而言:

如下的兩棵樹,進行上述操作後能返回true,但實際結果應該為false:

所以,正確的解法應該為深度優先搜尋(dfs),思路如下:

對 t1 及其左右子樹分別用 dfs 演算法,若其中一項滿足要求則返回true,否則返回false。

具體實現**如下:

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

bool

dfs(treenode* t1,treenode* t2)

};

由於dfs最長深度為n,搜尋t1值與t2值的時間也為o(n),但由於c++的短路原則,演算法整體時間複雜度為o(n),空間複雜度為o(1),滿足題目所述的萬節點要求,最終執行評價如下:

面試題 04 10 檢查子樹

面試題 04.10.檢查子樹 中等題 遞迴 檢查子樹。你有兩棵非常大的二叉樹 t1,有幾萬個節點 t2,有幾萬個節點。設計乙個演算法,判斷 t2 是否為 t1 的子樹。如果 t1 有這麼乙個節點 n,其子樹與 t2 一模一樣,則 t2 為 t1 的子樹,也就是說,從節點 n 處把樹砍斷,得到的樹與 ...

面試題04 10 檢查子樹

題目鏈結 檢查子樹。你有兩棵非常大的二叉樹 t1,有幾萬個節點 t2,有幾萬個節點。設計乙個演算法,判斷 t2 是否為 t1 的子樹。如果 t1 有這麼乙個節點 n,其子樹與 t2 一模一樣,則 t2 為 t1 的子樹,也就是說,從節點 n 處把樹砍斷,得到的樹與 t2 完全相同。示例1 輸入 t1...

力扣面試題彙總

1.永遠不要沉迷碎片化的知識 2.謹慎播撒你的精力種子 3.改變我們的人生的,不單單是道理,還有方法 陣列1115 字串551 動態規劃406 雜湊表403 數學386 深度優先搜尋281 排序247 廣度優先搜尋227 樹224 貪心215 二叉樹195 二分查詢184 資料庫178 雙指標173...