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

題目:

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
在這裏插入圖片描述

先來理解一下題目 也就是樹A 完全包含樹B
在這裏插入圖片描述
A完全包含B 並且每個節點的值都相同

解題思路:

1.先遍歷一遍A樹找有沒有B的根節點
  • 先對比A的根節點與B的根節點是否相同
  • 如找不到,在從A的左子樹找有沒有與B根節點相同的
  • 如找不到,在從A的右子樹找有沒有與B根節點相同的
  • 都沒找到說明B不是A的子結構
2.如果找到了與B的根節點相同的節點
  • 然後從A的左子樹每一項與B的左子樹對比,如果有一項不相同直接說明不是子結構
  • 如果左子樹完全匹配,在遍歷右子樹的每一項,如果一項不同直接return false
  • 如果遍歷左右樹種,出現B遍歷完了,A還沒有直接return true,說明是包含關係
code:
/*
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)
    {
        bool flag = false;
        
           if(!pRoot1 || !pRoot2)
               return false;
            
        
        ////根節點直接相同
        if(pRoot1->val == pRoot2->val)
        {
            flag = tree1HaveTree2(pRoot1,pRoot2);
        }
        /////左子樹繼續找
        if(!flag)
        {
            flag = HasSubtree(pRoot1->left,pRoot2);
        }
        /////右子樹繼續找
        if(!flag)
        {
            flag = HasSubtree(pRoot1->right,pRoot2);
        }
        
        return flag;
        
        
    }
    
    bool tree1HaveTree2(TreeNode* node1,TreeNode* node2)
    {
        ////樹2遍歷完成了說明是樹1的字結構
        if(node2 == nullptr)
            return true;
        ////樹1遍歷完了 ,說明不是子結構
        if(node1 == nullptr)
            return false;
       
        bool flag = true;
        
        if(node1->val != node2->val)
            return false;
        /////繼續匹配左子樹和右子樹
        if(flag)
            flag = tree1HaveTree2(node1->left,node2->left);
        if(flag)
            flag = tree1HaveTree2(node1->right,node2->right);
        
        return flag;
        
    }
};

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章