1. 程式人生 > >輸入兩棵二叉樹A,B,判斷B是不是A的子結構。

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。

要查詢樹A中是否存在和樹B結構一樣的子樹。我們可以分為兩步:
第一步在樹A中找到和B的根節點一樣的值一樣的結點R,第二步在判斷樹A中以R為根節點的子樹是不是包含和樹B一樣的結構。
樹的結點:

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
}

第一步程式碼:

bool HasSubtree(TreeNode*
pRoot1, TreeNode* pRoot2) { bool result = false; if (pRoot1 != NULL&&pRoot2 != NULL) { if (pRoot1->val == pRoot2->val) { //找到相同結點後判斷是否含有相同結構 result = DoesTree1HaveTree2(pRoot1, pRoot2); } if (!result)//在左子樹中查詢相同結點 { result =
HasSubtree(pRoot1->left, pRoot2); } if (!result)//在右子樹中找相同結點 { result = HasSubtree(pRoot1->right, pRoot2); } } return result; }

判斷樹A中以R為根節點的子樹是不是包含和樹B一樣的結構。
第二步程式碼:

//遞迴判斷結構是否相同,直到將pRoot2所有結點完全判斷
bool DoesTree1HaveTree2(TreeNode*pRoot1, TreeNode*
pRoot2){ if (pRoot2 == NULL){ return true; } if (pRoot1 == NULL){ return false; } if (pRoot1->val != pRoot2->val){ return false; } return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) && DoesTree1HaveTree2(pRoot1->right, pRoot2->right); }