题目描述

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

一 . 二叉树的概念

        树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可以表示层次关系。每个结点最多有两棵子树。左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。即为下图。。

C#定义二叉树:

public class BinaryTreeNode
{
//节点
public int Data { get; set; }
//左子树
public BinaryTreeNode leftChild { get; set; }
//右子树
public BinaryTreeNode rightChild { get; set; }
//数据域
public BinaryTreeNode(int data)
{
this.Data = data;
}
//指针域
public BinaryTreeNode(int data, BinaryTreeNode left, BinaryTreeNode right)
{
this.Data = data;
this.leftChild = left;
this.rightChild = right;
}
}

二 . 题目分析

A-B两个二叉树,判断B是否为A的子结构。

想法:该题使用递归法。步骤为:在树A中找到和B的根结点的值一样的结点;判断以该节点为中心的左右子树是否相同,相同即为子结构,不同继续递归,直到结束。

三 . 代码实现:

class Solution
{
public bool HasSubtree(TreeNode pRoot1, TreeNode pRoot2)
{
// write code here
if(pRoot1 == null || pRoot2 == null)
{
return false;
}
else
{
return Judge(pRoot1,pRoot2);
}
}
public static bool Judge(TreeNode pRoot1, TreeNode pRoot2)
{
//解释说是pRoot2如果全部遍历完且与pRoot1一一对应,则返回正确
//如果pRoot2还没遍历完,而pRoot1已经遍历结束,则错误。
if (pRoot2 == null)
{
//递归成功条件,什么意思呢,比如B仅有一个节点,且存在和A一样的节点,那肯定是是咯
return true;
}
if (pRoot1 == null)
{
//递归失败条件,如果你一直递归下去,A都结束了,还没找到,那肯定不是咯。
return false;
}
if (pRoot1.val == pRoot2.val)
{
//递归成功条件2,左右节点都一样
if (Judge(pRoot1.left,pRoot2.left) && Judge(pRoot1.right,pRoot2.right))
{
return true;
}
}
//递归
return Judge(pRoot1.left,pRoot2) || Judge(pRoot1.right,pRoot2);
}
}

PS:该题考点依旧是代码的鲁棒性,所以要格外注意,其实貌似就这么一处吧if(pRoot1 == null || pRoot2 == null)。。

剑指Offer的学习笔记(C#篇)-- 树的子结构的更多相关文章

  1. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  2. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...

  3. 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...

  4. 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  5. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  6. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

  7. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  8. 剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 一 . 思维发散 借助这个题目,我想用一个更好理解的方法说一说递归. ...

  9. 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...

  10. 剑指Offer的学习笔记(C#篇)-- 对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...

随机推荐

  1. 7-10 括号匹配(25 分) 【STL】

    7-10 括号匹配(25 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行中给出一行字 ...

  2. Android Weekly Notes Issue #261

    Android Weekly Issue #261 June 11th, 2017 Android Weekly Issue #261 本期内容包括: Adaptive Icons; Kotlin实现 ...

  3. 使用electron静默打印

    1.使用electron打印的理由 很多情况下程序中使用的打印都是用户无感知的.并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大. e ...

  4. codeforces 之 Little Pigs and Wolves

    B-Little Pigs and Wolvestime limit per test2 secondsmemory limit per test256 megabytesinputstandard ...

  5. Buffer的数据存取

    缓冲区 存放要读取的数据 缓冲区 和 通道 配合使用 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与N ...

  6. 51nod 80分算法题

    1537:见前几篇. 1627:题意:给定n,m的网格(10^5),初始状态为(1,1),你每次可以瞬移到右下方(不可以同行同列逗留)任何一个方格里,求移动到n,m的方案数. 一句话题解:首先很容易想 ...

  7. 分享知识-快乐自己:Excel快速导入Oracle 数据库

    需求: oracle 数据库有一个student表,现有一个excel表:student.xlsx,需导入oracle数据库student表中. student表的拥有者是c##MLQ1  密码为:x ...

  8. firfox 和 chrome 移动端Web开发页面调试

    Firefox浏览: 1."Alt+t" 选择工具栏中的“工具”>Web开发者工具>查看器>点击红框所指的地方 或者 F12 [当然这个歌前提是你没有安装fire ...

  9. Linux_学习_01_ 压缩文件夹

    二.参考资料 1.Linux下压缩某个文件夹命令

  10. codeforces 703D D. Mishka and Interesting sum(树状数组)

    题目链接: D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megaby ...