1. 程式人生 > 實用技巧 >劍指offer JZ-17

劍指offer JZ-17

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構) 示例1

輸入

複製
{8,8,#,9,#,2,#,5},{8,9,#,2}

返回值

複製
true

思路:

判斷樹的結構,很明顯需要遞迴。

若p2是p1的子樹,則應該同時滿足以下條件:

  1.p2->left是p1->left的子樹

  2.p2->right是p1->right的子樹

  3.p1->val == p2->val;

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/ class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(!pRoot1 || !pRoot2) return false; return Check(pRoot1,pRoot2) || Check(pRoot1->left, pRoot2) || Check(pRoot1->right, pRoot2); } bool Check(TreeNode* p1, TreeNode* p2) {
if(p2 && !p1) return false; if(!p2) return true; if(p1->val != p2->val) return false; return Check(p1->left, p2->left) && Check(p1->right,p2->right); } };
View Code