1. 程式人生 > 資訊 >我國航天員未來能在太空上網:天舟二號搭載天地網際網路資料代傳功能

我國航天員未來能在太空上網:天舟二號搭載天地網際網路資料代傳功能

來源:力扣(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); } };