(剑指Offer)面试题18:树的子结构

题目:

输入两棵二叉树A和B,判断B是不是A的子结构。

二叉树结构定义如下:

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

思路:

判断二叉树B是否为二叉树A的子树:

首先判断二叉树A的根节点值是否等于二叉树B的根节点值;

如果是,则继续往下遍历,判断二叉树A的左子节点和二叉树B的左子结点以及二叉树A的右子节点和二叉树B的右子节点是否都相等,直到叶子节点;(递归)

return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right);

如果不是,则判断二叉树B是否为二叉树A左子树的子树或者二叉树B是否为二叉树A右子树的子树;(递归)

result=HasSubtree(pRoot1->left,pRoot2);
result=HasSubtree(pRoot1->right,pRoot2);

代码:

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
};

bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2){
    if(pRoot2==NULL)
        return true;
    if(pRoot1==NULL)
        return false;
    if(pRoot1->val!=pRoot2->val)
        return false;
    return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right);
}

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
    bool result=false;
    if(pRoot1!=NULL && pRoot2!=NULL){
        if(pRoot1->val==pRoot2->val)
            result=IsSubtree(pRoot1,pRoot2);
        if(!result)
            result=HasSubtree(pRoot1->left,pRoot2);
        if(!result)
            result=HasSubtree(pRoot1->right,pRoot2);
    }
    return result;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/6e196c44c7004d15b1610b9afca8bd88?rp=1

AC代码:

class Solution {
public:
    bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2){
        if(pRoot2==NULL)
            return true;
        if(pRoot1==NULL)
            return false;
        if(pRoot1->val!=pRoot2->val)
            return false;
        return IsSubtree(pRoot1->left,pRoot2->left) && IsSubtree(pRoot1->right,pRoot2->right);
    }

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result=false;
        if(pRoot1!=NULL && pRoot2!=NULL){
            if(pRoot1->val==pRoot2->val)
                result=IsSubtree(pRoot1,pRoot2);
            if(!result)
     			result=HasSubtree(pRoot1->left,pRoot2);
            if(!result)
                result=HasSubtree(pRoot1->right,pRoot2);
        }
        return result;
    }
};

  

    原文作者:AndyJee
    原文地址: https://www.cnblogs.com/AndyJee/p/4649017.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞