我國航天員未來能在太空上網:天舟二號搭載天地網際網路資料代傳功能
阿新 • • 發佈:2021-05-30
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
輸入兩棵二叉樹A和B,判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構)
B是A的子結構, 即 A中有出現和B相同的結構和節點值。
例如:
給定的樹 A:
3
/ \
4 5
/ \
1 2
給定的樹 B:
4
/
1
返回 true,因為 B 與 A 的一個子樹擁有相同的結構和節點值。
示例 1:
輸入:A = [1,2,3], B = [3,1]
輸出:false
示例 2:
輸入:A = [3,4,5,1,2], B = [4,1]
輸出:true
限制:
0 <= 節點個數 <= 10000
解法:
首先縷清思路,第一步應先遍歷A找到與B根節點有相同值的結點,第二步再判斷此結點後續結點是否與B後續結點相同(即同步遍歷A中與B根節點值相等的結點),若否回到第一步,直到B遍歷完。
其次想演算法,既然一直在遍歷樹,除非有特別要求,平時自然用程式碼較簡潔的遞迴方法。
class Solution { public: bool isSubStructure(TreeNode* A, TreeNode* B) //找與B根結點值相同的結點 { auto result = false; if(A != nullptr and B!= nullptr) //遍歷完畢條件 {if(Equal(A -> val,B->val)) //找到了,繼續同步遍歷比對後續結點 result = DoesAHaveB(A,B); if(!result) result = isSubStructure(A->left,B); if(!result) result = isSubStructure(A->right,B); } return result; }bool Equal(int A,int B) { return (A == B?true:false); //此函式在本題無關緊要,因為此題樹結點val為int,若型別為double,則由於精度問題改寫這個函式就有必要了。 } bool DoesAHaveB(TreeNode* A,TreeNode* B) //A與B根結點值相等,同步遍歷之 { if(B == nullptr) //B遍歷完了 return true; if(A == nullptr) //B未遍歷完而A遍歷完了 return false; if(!Equal(A->val,B->val)) //A、B均未遍歷完但值不等 return false; return DoesAHaveB(A->left,B->left) //A、B指標指向的當前結點值相等,遞迴遍歷後續結點。 and DoesAHaveB(A->right,B->right); } };