剑指offer学习笔记(11)--树的子结构

考点:二叉树的遍历、鲁棒性

题目描述

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

分析思路

第一步,遍历要判断A,B的根节点值是否一样。写一个方法来遍历大树,找到一个和小树根节点值相等的节点。若找到,则调第二步。此处需要设一个中间变量result,若经过第二步返回false,须继续递归遍历大树。

第二步,传入两棵根节点值相同的树,判断是否和左右节点值是否一样。判断树A中R为根节点的子树是否和树B具体相同结构。如果节点R的值和树B的根节点不相同,则肯定不具有相同节点;如果值相同,则递归判断它们各自左右节点的值是否相同。递归终止条件是到达了树A或树B的叶节点。此部分,注意边界处理判断。

实现代码

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
       bool result=false;
        if(pRoot1!=NULL && pRoot2!= NULL){
            //如果存在值相等的节点,进一步判断
            if(pRoot1->val ==pRoot2->val){
                result=DoesTree1hasTree2(pRoot1,pRoot2);
            }
            //如果为false,遍历A的左右节点查找
            if(!result){
                result=HasSubtree(pRoot1->left,pRoot2);
            }
            if(!result){
                result=HasSubtree(pRoot1->right,pRoot2);
            }
        }
        return result;
    }
private:
    bool DoesTree1hasTree2(TreeNode* pRoot1, TreeNode* pRoot2){
        //2为空树
        if(pRoot2==NULL)
            return true;
        //1为空树
        if(pRoot1==NULL)
            return false;
        if(pRoot1->val !=pRoot2->val){
            return false;
        }
        //判断左右孩子分别是否相等
        return DoesTree1hasTree2(pRoot1->left,pRoot2->left) && 
            DoesTree1hasTree2(pRoot1->right,pRoot2->right);
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值