剑指offer26 树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。
我们规定空树不是任何树的子结构。
样例
树A:
8
/ \
8 7
/ \
9 2
/ \
4 7
树B:
8
/ \
9 2
返回 true ,因为B是A的子结构。
思路:
第一步,遍历tree1中所有与tree2头节点相等的结点
第二步,找到相同的头节点,然后依次判断其左子树与右子树是否相等。
AcWing-37 c++ code:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasSubtreeCore(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2 == NULL){
return true;
}
if(pRoot1 == NULL){
return false;
}
if(pRoot1->val != pRoot2->val){
return false;
}
return hasSubtreeCore(pRoot1->left, pRoot2->left) && hasSubtreeCore(pRoot1->right, pRoot2->right);
}
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
bool result = false;
if(pRoot1 && pRoot2){
if(pRoot1->val == pRoot2->val){
result = hasSubtreeCore(pRoot1, pRoot2);
}
if(!result){
result = hasSubtree(pRoot1->left, pRoot2);
}
if(!result){
result = hasSubtree(pRoot1->right, pRoot2);
}
}
return result;
}
};
AcWing-37 python code:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def hasSubtreeCore(self, pRoot1, pRoot2):
if pRoot2 == None:
return True
if pRoot1 == None:
return False
if pRoot1.val != pRoot2.val:
return False
return self.hasSubtreeCore(pRoot1.left, pRoot2.left) and self.hasSubtreeCore(pRoot1.right, pRoot2.right)
def hasSubtree(self, pRoot1, pRoot2):
"""
:type pRoot1: TreeNode
:type pRoot2: TreeNode
:rtype: bool
"""
result = False
if pRoot1 and pRoot2:
if pRoot1.val == pRoot2.val:
result = self.hasSubtreeCore(pRoot1, pRoot2)
if not result:
result = self.hasSubtree(pRoot1.left, pRoot2)
if not result:
result = self.hasSubtree(pRoot1.right, pRoot2)
return result