26 树的子结构
题目
输入两棵二叉树A和B,判断B是不是A的子结构。例如下图中的两棵二叉树,由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。
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)