剑指offer源码系列-树的子结构

输入两颗二叉树A,B,判断B是不是A的子结构。

#include<stdio.h>
#include<iostream>
using namespace std;
struct BinaryTreeNode{
    int value;
    BinaryTreeNode* left;
    BinaryTreeNode* right;
};
//递归判断结点是否相等
bool doesTree1HasTree2(BinaryTreeNode* aRoot,BinaryTreeNode* bRoot){
    if(bRoot==NULL{
        return true;
    }
    if(aRoot==NULL){
        return false;
    }
    if(aRoot->value!=bRoot->value){
        return false;
    }
    return doesTree1HasTree2(aRoot->left,bRoot->left)&&doesTree1HasTree2(aRoot->right,bRoot->right);
}

ListNode* hasSubtree(BinaryTreeNode* aRoot,BinaryTreeNode* bRoot){
    bool result = false;
    if(aRoot!=NULL&&bRoot!=NULL){
            if(aRoot->value==bRoot->value){
                result = doesTree1HasTree2(aRoot,bRoot);
            }
            if(!result){
                result = hasSubtree(aRoot->left,bRoot);
            }
            if(!result){
                result = hasSubtree(aRoot->right,bRoot);
            }
    }
    return result;
}
int main(){
    return 0;
}
时间: 2024-10-13 03:15:44

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

剑指offer源码系列-跳台阶

这是一个斐波那契数列的变形 题目1388:跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:3030解决:1226 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 5 样例输出: 8 #include<iostream> #includ

剑指offer源码系列-变态跳台阶

题目1389:变态跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1906解决:1102 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=50). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 6 样例输出: 32 解法分析: 分析:用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙

《剑指Offer》题目:树的子结构

题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点:2.判断两个二叉树是否有相同的结构 Java代码: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public class

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

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题解:递归 1 public static boolean HasSubtree(TreeNode root1,TreeNode root2) { 2 if(root1==null||root2==null){ 3 return false; 4 } 5 return tree1HasTree2(root1,root2)||HasSubtree(root1.left,root2)||HasSub

剑指offer源码-旋转数组的最小数字

题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:5659解决:1273 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n个整数,

【剑指offer】十一。树的子结构

题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 分析:两棵树A 和B,判断B是不是A的子树,分为三种情况,一,A的根和B的根相同,则继续比较A的左子树与B的左子树,A的右子树与B的右子树.二,若A的根和B的根不同,这比较B是不是在A的左子树中,三,比较B是不是在A的右子树中.代码如下: 1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null

【剑指offer】Q18:树的子结构

类似于字符串的匹配,我们总是找到第一个匹配的字符,在继续比較以后的字符是否所有同样,假设匹配串的第一个字符与模式串的第一个不同样,我们就去查看匹配串的下一个字符是否与模式串的第一个同样,相应到这里,就是我们要遍历root1,找到与root2同样的第一个结点,若root1的根不同样,那么我们查找其左子树是否有第一个同样的,同样的操作再去看右子树是否有同样的第一个,若找到了第一个同样的,与字符串匹配思想一样,字符串匹配中,是比較以后的字符是否所有同样,这里我们比較其左右子树是否 也相应同样,若找到了

剑指offer(17)层次遍历树

题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null) return list; TreeNode node = root; Queue<TreeNo

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑