26 树的子结构

题目

输入两棵二叉树A和B,判断B是不是A的子结构。例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。

牛客网 OJ
AcWing OJ

C++ 题解

要查找树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) {
	}
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        
        bool result = false;
        
        // 满足两个指针都不是nullptr,再进行判断
        if(pRoot1 != nullptr && pRoot2 != nullptr)
        {
            // 当找到根值相等的节点,调用函数判断是否存在包含关系
            if(pRoot1->val == pRoot2->val)
            {
                result = Tree1HasTree2(pRoot1,pRoot2);
            }
            // 如果上面没有找到根值相等的节点,则继续在左子树中去搜索是否存在这样的节点
            if(!result)
            {
                 result = HasSubtree(pRoot1->left,pRoot2);
            }
            // 如果上面没有找到根值相等的节点,则继续在右子树中去搜索是否存在这样的节点
            if(!result)
            {
                 result = HasSubtree(pRoot1->right,pRoot2);
            }
        }
        
        
        return result;
    }
    
    
    // 判断是否具备包含关系
    bool Tree1HasTree2(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2 == nullptr)
            return true;
        
        if(pRoot1 == nullptr)
            return false;
        
        if(pRoot1->val != pRoot2->val)
            return false;
        
        // 左右子树必须同时具备包含关系
        return Tree1HasTree2(pRoot1->left,pRoot2->left) && Tree1HasTree2(pRoot1->right,pRoot2->right);
    }
};

python 题解

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        
        if  pRoot1 and  pRoot2:
            if pRoot1.val == pRoot2.val:
                result = self.Tree1HasTree2(pRoot1,pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.left,pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.right,pRoot2)   
        
        return result
        
        
    def Tree1HasTree2(self,pRoot1,pRoot2):
        if pRoot2 == None:
            return True
        
        if pRoot1 == None:
            return False
        
        if pRoot1.val != pRoot2.val:
            return False
        
        return self.Tree1HasTree2(pRoot1.left,pRoot2.left) and self.Tree1HasTree2(pRoot1.right,pRoot2.right)
posted @ 2019-01-30 19:05  youngliu91  阅读(107)  评论(0编辑  收藏  举报