劍指offer(十七):樹的子結構
阿新 • • 發佈:2020-08-04
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)jia由於對遞迴的使用不夠熟練,所以程式碼實現較為繁瑣:
class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2 == NULL||pRoot1==NULL) return false; else{ bool result = false; preOrder(pRoot1,pRoot2,pRoot2,result);if(result) return true; else return false; } } void compare(TreeNode* pRoot1, TreeNode* pRoot2,bool &flag){ //一種特殊情況, if(!pRoot1&&pRoot2){ flag = false; } //當flag=false的時候無需再繼續比較 if(pRoot1&&pRoot2&&flag){ if(pRoot1->val == pRoot2->val){ flag = true; } else{ flag = false; } //遞迴比較其左右子樹 compare(pRoot1->left, pRoot2->left,flag); compare(pRoot1->right, pRoot2->right,flag); } } void preOrder(TreeNode* pRoot1, TreeNode* pRoot2,TreeNode* pRootHead2,bool &flag){ //先序遍歷 if(pRoot1 && pRoot2 && !flag){ if(pRoot1->val == pRoot2->val){ flag = true; compare(pRoot1,pRoot2,flag);//存在相等結點,則去比較子樹 if(!flag){ pRoot2 = pRootHead2; //讓pRoot2繼續指向子樹根節點 flag = false; } } preOrder(pRoot1->left,pRoot2,pRootHead2,flag); preOrder(pRoot1->right,pRoot2,pRootHead2,flag); } } };