[二叉树] 树的子结构

题目描述

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

解题思路:
前序遍历A树,寻找A树中和B树根节点相同的节点。
A. 若A树的节点和B树的根节点相同,则A,B两树同时以当前节点开始前序遍历,比较A,B树中节点是否相同,若不相同则退出当前的遍历,并返回当前结果。
B. 若A树的节点和B树的根节点不相同,或A中返回结果为false,继续遍历A树,查看是否还存在与B树根节点相同的节点

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
class Solution {
public:
    bool isSameTree(TreeNode* x, TreeNode* y)
    {
        bool res = false;
        if(y == NULL) return true;//y=NULL,证明B树中所有节点已经比较完了,并且均与A树节点相同
        if(x == NULL) return false;//B树节点还没有比较完,A树节点已经比较完了。
        
        if(x->val == y->val)
        {
            res = isSameTree(x->left,y->left);
            if(res)
            {
                res = isSameTree(x->right,y->right);
            }
        }
        return res;
    }
    bool HasSubtree(TreeNode*x, TreeNode* y)
    {
        bool res = false;
        if(x==NULL || y==NULL)
            return false;
        if(x->val == y->val)//在A树中找到与B树根节点相同的节点
        {
            res = isSameTree(x,y);
        }
        if(!res)//没有找到相同的节点或B树此时不是A树种以当前节点为根节点树的子树
            res = HasSubtree(x->left,y);
        if(!res)
            res = HasSubtree(x->right,y);
        
        return res;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上一篇文章讲述了树的概念, 特征以及分类, 旨在让我们理解什么是树, 树的一些常用的概念是什么,树的分类有哪些等。...
    DevCW阅读 6,335评论 4 10
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 9,978评论 1 31
  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 11,598评论 0 14
  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,595评论 0 25
  • 可见切口和不可见切口 遇见多种可能性,抉择 为什么剪辑能被接受 细小变化被视觉忽略,明显变化被重新界定语境 把错误...
    王尔哆阅读 5,797评论 0 2

友情链接更多精彩内容