树02--树的子结构

2024-05-30 23:58
文章标签 02 子结构

本文主要是介绍树02--树的子结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

树02--树的子结构-jz17

  • 题目概述
  • 解析&参考答案
  • 注意事项
  • 说明

题目概述

  • 算法说明
    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
  • 测试用例
    {8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
    {8,8,7,9,3,#,#,#,#,4,7},{8,9,2}
    {8,8,#,9,#,2,#,5},{8,9,#,2}
    {8,8,#,9,#,2,#,5},{8,9,#,3}
    {8,#,8,#,9,#,2,#,5},{8,#,9,#,2}
    {8,#,8,#,9,#,2,#,5},{8,#,9,3,2}
    {},{8,#,9,3,2}
    {8,#,9,3,2},{}
    {},{}
    {1,2,3,4,5,#,#,#,#,6},{1,2,#,4,5}
    {1,7,3,2,6,#,#,4,5},{2,4,5}
    {1,2,3},{2,3,#}
    {1,8,7,9,2},{8,9,2}
    {1,2,3,4,5},{1,2,3}
    true
    false
    true
    false
    true
    false
    false
    false
    false
    true
    true
    false
    true
    true

解析&参考答案

  • 解析
    若树B是树A的子结构,则子结构的根节点可能为树A的任意一个节点。因此需要先遍历A中的每一个节点,再判断A中某个节点为根的子树是否包含树B(recur(A,B))。
  • 参考答案
vim jz17.go
package mainimport "fmt"type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}func HasSubtree(pRoot1 *TreeNode, pRoot2 *TreeNode) bool {if pRoot1 == nil || pRoot2 == nil {return false}return reCur(pRoot1, pRoot2) || HasSubtree(pRoot1.Left, pRoot2) || HasSubtree(pRoot1.Right, pRoot2)
}func reCur(A *TreeNode, B *TreeNode) bool {if B == nil {return true}if A == nil || A.Val != B.Val {return false}return reCur(A.Left, B.Left) && reCur(A.Right, B.Right)
}func main() {root := &TreeNode{8, &TreeNode{8, &TreeNode{9, nil, nil}, &TreeNode{2, &TreeNode{4, nil, nil}, &TreeNode{7, nil, nil}}},&TreeNode{7, nil, nil}}subTree := &TreeNode{8, &TreeNode{9, nil, nil},&TreeNode{2, nil, nil}}ret := HasSubtree(root, subTree)fmt.Println(ret)
}vim jz17_test.go
package mainimport "testing"func TestHasSubtree(t *testing.T) {tests := []struct {root   *TreeNodesub    *TreeNoderesult bool}{{&TreeNode{8, &TreeNode{8, &TreeNode{9, nil, nil}, &TreeNode{2, &TreeNode{4, nil, nil}, &TreeNode{7, nil, nil}}}, &TreeNode{7, nil, nil}},&TreeNode{8, &TreeNode{9, nil, nil}, &TreeNode{2, nil, nil}},true,},{&TreeNode{8, &TreeNode{8, &TreeNode{9, nil, nil}, &TreeNode{3, &TreeNode{4, nil, nil}, &TreeNode{7, nil, nil}}}, &TreeNode{7, nil, nil}},&TreeNode{8, &TreeNode{9, nil, nil}, &TreeNode{2, nil, nil}},false,},{nil,nil,false,},}for _, tt := range tests {if actual := HasSubtree(tt.root, tt.sub); actual != tt.result {t.Errorf("%v and %v got %v, expected %v", tt.root, tt.sub, HasSubtree(tt.root, tt.sub), tt.result)}}
}

注意事项

recur(A,B) 终止条件:
当节点B为空:说明树B已匹配完成(越过叶子节点),因此返回 true;
当节点A为空:说明已经越过树A叶子节点,即匹配失败,返回 false;
当节点A和B的值不同:说明匹配失败,返回 false;
特例:当A或B为空的时候返回 false。

说明

  1. 当前使用 go1.15.8
  2. 参考 牛客网–剑指offer
    标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
    力扣中文网–面试题26. 树的子结构(先序遍历 + 包含判断,清晰图解)

注意!!!

  • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
  • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解

这篇关于树02--树的子结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1017103

相关文章

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

滚雪球学MyBatis(02):环境搭建

环境搭建 前言 欢迎回到我们的MyBatis系列教程。在上一期中,我们详细介绍了MyBatis的基本概念、特点以及它与其他ORM框架的对比。通过这些内容,大家应该对MyBatis有了初步的了解。今天,我们将从理论走向实践,开始搭建MyBatis的开发环境。了解并掌握环境搭建是使用MyBatis的第一步,也是至关重要的一步。 环境搭建步骤 在开始之前,我们需要准备一些必要的工具和软件,包括J

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录,BTP集成开发环境的搭建这方面。 目录 1,账号注册 2,BTP登录URL 3,如何在BTP上进行开发? 以下是详细内容。 1,账

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【SpringMVC学习02】SpringMVC入门程序

转自:http://blog.csdn.net/yerenyuan_pku/article/details/72231272 现有这样一个需求:使用SpringMVC这个框架实现商品列表的展示。这是我对这个需求的分析:我这里假设请求的url为/itemList.action,由于我想要展示商品列表,所以是并不需要传递参数的,再次是这里仅仅是一个SpringMVC的一个入门小程序,并不会与MyBa

02 Shell Script注释和debug

Shell Script注释和debug 一、ShellScript注释 ​ # 代表不解释不执行 ​ 语法:# # 创建myshell.sh文件[root@localhost ~]# vi myshell.sh # 写入内容#!/bin/bash# 打印hello world(正确)echo "hello world"echo "hello 2" # 注释2(正确)echo

python+selenium2轻量级框架设计-02日志类

本文介绍如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里。 import logging,time,osclass Logger(object):def __init__(self,logger):'''指定保存日志的文件路径,日志级别,以及调用文件将日志存入到指定的文件中'''#创建loggerself.logger = logging.getLogge

postman基础教程-02环境变量

编写的API往往需要在多个环境下执行,而Postman 提供了两种类型的变量:环境变量和全局变量,从而很好的解决了这个问题。 环境变量有效范围仅仅在于你所选取的环境,全局变量对所有的环境都试用 api可能需要在拨通的环境中运行,所以api请求的服务器地址不能写死,希望是可以配置的,创建环境变量有多种方式。 环境变量 1.手工预先创建环境变量 点击小眼睛按钮即可创建环境变量,第一个是环境变量