1. 程式人生 > 實用技巧 >劍指offer(十七):樹的子結構

劍指offer(十七):樹的子結構

題目描述

輸入兩棵二叉樹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); } } };