• (剑指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;
        }
    };
    

      

  • 相关阅读:
    codevs 1031 质数环
    codevs 1005 生日礼物
    codevs 1004 四子连棋
    codevs 2292 图灵机游戏
    1439 统计素数个数
    1675 大质数 2
    codevs 1462 素数和
    [NOIp2012提高组]借教室
    [NOIp2007提高组]矩阵取数游戏
    [TJOI2017]城市
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4649017.html
Copyright © 2020-2023  润新知