福哥答案2021-02-07:

对head1和head2序列化为str1和str2。然后用kmp算法去判断str2是否是str1的子串。如果是,head2是子树;如果不是,head2不是子树。

代码用golang编写,代码如下:

package main

import "fmt"

func main() {
root := &TreeNode{}
root.Val = 1 root.Left = &TreeNode{}
root.Left.Val = 2 root.Right = &TreeNode{}
root.Right.Val = 3 root.Left.Right = &TreeNode{}
root.Left.Right.Val = 4 root.Right.Left = &TreeNode{}
root.Right.Left.Val = 5 fmt.Println(IsSubTree(root, root.Right)) } type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
} //序列化
func serialize(head *TreeNode) string {
ansVal := ""
ans := &ansVal
process(head, ans)
return (*ans)[1:]
} func process(head *TreeNode, ans *string) {
if head == nil {
*ans += ",N"
return
}
*ans += fmt.Sprintf(",%d", head.Val)
process(head.Left, ans)
//*ans += fmt.Sprintf(",%d", head.Val)
process(head.Right, ans)
//*ans += fmt.Sprintf(",%d", head.Val)
}
func getNextArr(m string) []int {
mLen := len(m)
if mLen == 1 {
return []int{-1}
}
ret := make([]int, mLen)
ret[0] = -1
cn := 0
for i := 2; i < mLen; i++ {
if m[i] == m[cn] {
cn++
ret[i] = cn
i++
} else if cn > 0 {
cn = ret[cn]
} else {
ret[i] = 0
i++
}
}
return ret
} //求子串位置
func kmp(s string, m string) int {
sLen := len(s)
mLen := len(m)
if sLen < mLen {
return -1
}
next := getNextArr(m)
x := 0
y := 0
for x < sLen && y < mLen {
if s[x] == m[y] {
x++
y++
} else if next[y] >= 0 {
y = next[y]
} else {
x++
}
}
if y == mLen {
return x - y
} else {
return -1
}
} //求是否是子树
func IsSubTree(head1 *TreeNode, head2 *TreeNode) bool {
if head2 == nil {
return true
}
if head1 == nil {
return false
}
if kmp(serialize(head1), serialize(head2)) >= 0 {
return true
} else {
return false
}
}

  

执行结果如下:

***
[评论](https://user.qzone.qq.com/3182319461/blog/1612654678)

2021-02-07:给定两棵二叉树的头节点head1和head2,如何判断head1中是否有某个子树的结构和head2完全一样?的更多相关文章

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

    1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...

  2. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  3. 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

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

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  5. LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++

    Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...

  6. 给定两个list A ,B,请用找出 A ,B中相同的元素,A ,B中不同的元素 ??

    A.B 中相同元素:print(set(A)&set(B)) A.B 中不同元素:print(set(A)^set(B))

  7. 代码随想录训练营day 5|24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07.链表相交 142.环形链表Ⅱ

    24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行 ...

  8. Same Tree 比较两个二叉树是否完全相同

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  9. 【遍历二叉树】08判断两个二叉树是否相同【Same Tree】

    迭代版本用的是二叉树的DFS,中的root->right->left +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  10. LeetCode——1305. 两棵二叉搜索树中的所有元素

    给你 root1 和 root2 这两棵二叉搜索树. 请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序.. 示例 1: 输入:root1 = [2,1,4], root2 = [1,0 ...

随机推荐

  1. ABAC框架-casbin

    参考文档:https://www.kancloud.cn/oldlei/casbin/1289455 参考博客:https://www.cnblogs.com/studyzy/p/11380736.h ...

  2. Feign调用报错The bean 'XXX.FeignClientSpecification', defined in null, could not be registered....的解决办法

    问题描述: 创建了两个远程调用类,一个是调用退款的,一个是调用折扣的 但是两个调用类是调用的同一个微服务 都叫@FeignClient(value = "xxx-shop") 如何 ...

  3. DBA必备的Mysql知识点:数据类型和运算符

    摘要:本文主要为大家带来Mysql中的3种数据类型和3种运算符. 本文分享自华为云社区<Mysql中的数据类型和运算符>,作者: 1+1=王. Mysql的数据类型 Mysql支持数值型. ...

  4. Java执行带空格的语句命令,cmd无法识别带空格路径的问题

    带空格的会识别不了 先说解决方法: 1:用cmd中的start: 在JAVA中可以如此使用: Runtime.getRuntime().exec("cmd /c start \"\ ...

  5. 第五章 C控制语句:循环

    一个好的语言应该能够提供以下三种形式的程序流: ●顺序执行语句序列(顺序) ●在满足某个条件之前反复执行一个语句序列(循环) ●通过进行一个判断在两个可选的语句序列之间选择执行(分支) 5.1whil ...

  6. 一起听、一起看、一起唱掀起Z世代青年社交浪潮

    6月5日,声网Agora 联合人人都是产品经理在成都举办了主题为"社交泛娱乐APP运营增长力和新玩法解析"的沙龙.现场围绕社交泛娱乐新玩法解析以及出海的新机遇.支付痛点.增长.运营 ...

  7. Java面试——MyBatis

    一.MyBatis 与 JDBC 的区别 [1]JDBC 是 Java 提供操作数据库的 API:MyBatis 是一个持久层 ORM 框架,底层是对 JDBC 的封装.[2]使用 JDBC 需要连接 ...

  8. 2020寒假学习笔记13------Python基础语法学习(二)

    同一运算符   同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址. 运算符 描述 is is 是判断两个标识符是不是引用同一个对象 is not is  not 是判断两个标识符是不是引用 ...

  9. php in_array 遍历,in_array大数组查询性能问题

    问题最近在实现一个项目接口的时候发现当数组过大的时候,数据返回的速度有点慢.接口数据返回最长反应时间2s,经过反复调试发现代码段耗时最长的部分在in_array()函数.解决过程在stackoverf ...

  10. Java数据类型、标识符

    目录 JavaSE 标识符 数据类型 基本数据类型 引用数据类型 转义字符 JavaSE 标识符 定义 Java中用于定义名称的都是标识符.例:包名,类名,变量名,方法名等. 组成 由数字.字母._. ...