剑指offer系列15---树的子结构

15【题目】输入两颗二叉树A,B,判断B是不是A的子结构。

【思路】

  首先判断A头结点与B头结点是否相同,相同再调用doesTree1HaveTree2()比较A下一个左右结点值与B下一个左右结点值是否相同;
                    不相同再继续查找A的下一个结点与B的头结点是否相同;

            //A B头结点均相同,调用函数doesTree1HaveTree2(),继续比较A B剩下的结点是否相同

            //不相同,比较A下一个做结点与B头结点是否相同

            //A左结点与B头结点仍然不相同,比较A右节点与B结点值

 1 package com.exe3.offer;
 2
 3 /**
 4  * 15【题目】输入两颗二叉树A,B,判断B是不是A的子结构。
 5  * @author WGS
 6  *
 7  */
 8 public class SubTree {
 9     public static class TreeNode{
10         int val;
11         TreeNode left=null;
12         TreeNode right=null;
13         public TreeNode(int n){
14             this.val=n;
15         }
16
17     }
18     //首先判断A头结点与B头结点是否相同,相同再调用doesTree1HaveTree2()比较A下一个左右结点值与B下一个左右结点值是否相同;
19      //                             不相同再继续查找A的下一个结点与B的头结点是否相同;
20     public boolean hasSubtree(TreeNode A,TreeNode B){
21         boolean flag=false;
22         if(A!=null && B!=null){
23             //A B头结点均相同,调用函数doesTree1HaveTree2(),继续比较A B剩下的结点是否相同
24             if(A.val==B.val)
25                 flag=doesTree1HaveTree2(A,B);
26             //不相同,比较A下一个做结点与B头结点是否相同
27             if(!flag)
28                 flag=hasSubtree(A.left,B);
29             //A左结点与B头结点仍然不相同,比较A右节点与B结点值
30             if(!flag)
31                 flag=hasSubtree(A.right,B);
32         }
33         return flag;
34
35     }
36     //
37     public boolean doesTree1HaveTree2(TreeNode A,TreeNode B){
38         if(B==null)        return true;
39         if(A==null)        return false;
40         if(A.val!=B.val)  return false;//头结点不同的话
41         //头结点相同,再用递归比较A,B中左右结点是否依次相同
42         return doesTree1HaveTree2(A.left,B.left)&&doesTree1HaveTree2(A.right,B.right);
43
44     }
45     public static void main(String[] args){
46         TreeNode A1=new TreeNode(8);
47         TreeNode A2=new TreeNode(8);
48         TreeNode A3=new TreeNode(7);
49         TreeNode A4=new TreeNode(9);
50         TreeNode A5=new TreeNode(2);
51         TreeNode A6=new TreeNode(4);
52         TreeNode A7=new TreeNode(7);
53         A1.left=A2;
54         A1.right=A3;
55         A2.left=A4;
56         A2.right=A5;
57         A5.left=A6;
58         A5.right=A7;
59
60         TreeNode B1=new TreeNode(8);
61         TreeNode B2=new TreeNode(9);
62         TreeNode B3=new TreeNode(2);
63         B1.left=B2;
64         B1.right=B3;
65         boolean flag=new SubTree().hasSubtree(A1, B1);
66         System.out.println(flag);
67     }
68 }
时间: 2024-12-31 03:58:18

剑指offer系列15---树的子结构的相关文章

剑指offer系列——17.树的子结构

Q:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) P.S.引用:https://blog.csdn.net/wuye999/article/details/100538399 树的子结构:如果一个二叉树B是二叉树A的子结构,那么这要B这个结构在A中出现就可以. 树的子树:如果一个二叉树B是二叉树A的子树,那么二叉树B必是A的某个节点的左子树或者右子树或者就是二叉树A本身. 可以看出子树是要比子结构更加严格的,如果B是A的子树那必定是A的子结构,反之则

剑指offer 18:树的子结构

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 验证B是不是A的子树,直觉做法,按照任意次序遍历A树,一旦出现和B树根节点相同的子节点,就将以此节点为根的子树与B树相比较,满足则查找成功,否则查找失败.树的先序遍历最为直观,此处以先序遍历为例,给出C++实现代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列4:斐波那契数列

剑指offer第九题,这个题很古老了.第一个想到的肯定是递归,很简单. 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int Fibonacci(int n) { 7 if (n == 0) 8 { 9 return 0; 10 } 11 if (n==1||n==2) 12 { 13 return 1; 14 } 15 else 16 {

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

【剑指Offer】【树】树的子结构

题目:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: bool isSubtree(TreeNode *pRoot1,TreeNode

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方

剑指Offer系列之题16~题20

目录 16.反转链表 17.合并两个排序的链表 18.树的子结构 ?? 19.二叉树的镜像 20.顺时针打印矩阵 16.反转链表 输入一个链表,反转链表后,输出新链表的表头. 从前往后,依次将当前节点的next指向前结点.用多个变量存储当前节点,下一节点,前结点. public class Solution { public ListNode ReverseList(ListNode head) { if(head==null) return null; //从头开始,依次将节点的next指向前