【剑指offer】树的子结构 Python+C++

241 阅读1分钟

【题目描述】

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

【思路】

两个函数, 1)第一个,首先需要在给定的大树中找到小树的根节点,以此根节点展开判断。当在大树中找到了小树的根节点,就调用第二个函数;如果没有找到,且结果为否时,就继续从大树的左子节点找;还没找到,就从大树的右子节点找。总之,第一个函数的作用就是在大树中找小树的根节点。

2)第二个,是传入两个值相同的根节点,判断以这两个根节点为根的两棵树是否包含相同结构。如果传入的两个根节点都不为空,且值相同,就继续将两棵树的左子树传入函数2,两个树的右子树传如函数2,做与运算,作为返回结果,是个递归过程。

【代码】

C++:
/*
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* root1, TreeNode* root2)
    {
        bool re=false;
        if(root1!=NULL&&root2!=NULL){
        if(root1->val==root2->val){
            re=judge(root1,root2);
        }
        if(!re){
            re=HasSubtree(root1->left,root2);
        }
        if(!re){
            re=HasSubtree(root1->right,root2);
        }
        }
        return re;
    }
    bool judge(TreeNode* root1, TreeNode* root2){
        if(root2==NULL){
            return true;
        }
        if(root1==NULL){
            return false;
        }
        if(root1->val!=root2->val){
            return false;
        }
       return judge(root1->left,root2->left)&&judge(root1->right,root2->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):
        result = False
        if pRoot1 and pRoot2:
            if pRoot1.val==pRoot2.val:
                result = self.judge(pRoot1,pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.left,pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.right,pRoot2)
        return result
    def judge(self,pRoot1,pRoot2):
        if not pRoot2:
            return True
        if not pRoot1:
            return False
        if pRoot1.val!=pRoot2.val:
            return False
        return self.judge(pRoot1.left,pRoot2.left) and self.judge(pRoot1.right,pRoot2.right)