天天看點

《劍指offer》——26. 樹的子結構題目解答

難度:中等

題目

輸入兩棵二叉樹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根節點相同的節點。 然後看看這個A中 節點左右分支是不是和B相同
           

知識點

遞歸
           
複雜度 O
時間複雜度 O(n)
空間複雜度 O(n)

代碼

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(!B||!A)
        {
            return false;
        }

        if(A->val==B->val)
        {
            if(isSubStructureCore(A,B))
            {
                return true;
            }
        }  

        return isSubStructure(A->left,B) || isSubStructure(A->right,B);
    }

    bool isSubStructureCore(TreeNode* A, TreeNode* B)
    {
        if(B==NULL)
        {
            return true;
        }

        if(A==NULL)
        {
            return false;
        }
        cout<<A->val<<"  "<<B->val<<endl;
        if(A->val==B->val)
        {
            return isSubStructureCore(A->left,B->left) && isSubStructureCore(A->right,B->right);
        }
        return false;
        
    }
};