2021-06-04:给定三个参数:二叉树的头节点head,树上某个节点target,正数K,从target开始,可以向上走或者向下走。返回与target的距离是K的所有节点。

福大大 答案2021-06-04:

记录父节点的map,key是当前节点,value是父节点。
访问集合,凡是节点被访问过,放在这个集合中。
队列,广度优先遍历。

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

package main

import "fmt"

func main() {

    root := &Node{Val: 1}
root.Left = &Node{Val: 2}
root.Right = &Node{Val: 3}
root.Right.Right = &Node{Val: 6}
root.Left.Left = &Node{Val: 4}
root.Left.Right = &Node{Val: 5}
root.Left.Right.Left = &Node{Val: 7}
root.Left.Right.Right = &Node{Val: 8}
target := root.Left
ret := distanceKNodes(root, target, 2)
for i := 0; i < len(ret); i++ {
fmt.Println(ret[i].Val)
} } type Node struct {
Val int
Left *Node
Right *Node
} func distanceKNodes(root *Node, target *Node, K int) []*Node {
parents := make(map[*Node]*Node)
parents[root] = nil
createParentMap(root, parents)
queue := make([]*Node, 0)
visited := make(map[*Node]struct{})
queue = append(queue, target)
visited[target] = struct{}{}
curLevel := 0
ans := make([]*Node, 0)
for len(queue) > 0 {
size := len(queue)
for size > 0 {
size--
cur := queue[0]
queue = queue[1:]
if curLevel == K {
ans = append(ans, cur)
}
if cur.Left != nil {
if _, ok := visited[cur.Left]; !ok {
visited[cur.Left] = struct{}{}
queue = append(queue, cur.Left)
}
}
if cur.Right != nil {
if _, ok := visited[cur.Right]; !ok {
visited[cur.Right] = struct{}{}
queue = append(queue, cur.Right)
}
}
if parents[cur] != nil {
if _, ok := visited[parents[cur]]; !ok {
visited[parents[cur]] = struct{}{}
queue = append(queue, parents[cur])
}
}
}
curLevel++
if curLevel > K {
break
}
}
return ans
} func createParentMap(cur *Node, parents map[*Node]*Node) {
if cur == nil {
return
}
if cur.Left != nil {
parents[cur.Left] = cur
createParentMap(cur.Left, parents)
}
if cur.Right != nil {
parents[cur.Right] = cur
createParentMap(cur.Right, parents)
}
}

执行结果如下:


左神java代码

2021-06-04:给定三个参数:二叉树的头节点head,树上某个节点target,正数K,从target开始,可以向上走或者向下走。返回与target的距离是K的所有节点。的更多相关文章

  1. Leetcode——863.二叉树中所有距离为 K 的结点

    给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K . 返回到目标结点 target 距离为 K 的所有结点的值的列表. 答案可以以任何顺序返回. 示例 1: 输 ...

  2. [LeetCode] All Nodes Distance K in Binary Tree 二叉树距离为K的所有结点

    We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...

  3. Leetcode 863. 二叉树中所有距离为 K 的结点

    863. 二叉树中所有距离为 K 的结点  显示英文描述 我的提交返回竞赛   用户通过次数39 用户尝试次数59 通过次数39 提交次数174 题目难度Medium 给定一个二叉树(具有根结点 ro ...

  4. 距离为K的节点 All Nodes Distance K in Binary Tree

    2018-07-26 17:38:37 问题描述: 问题求解: 解法一. 第一种解法是使用Graph + BFS.换言之,就是将二叉树转化为无向图,然后在无向图中使用BFS进行层次遍历即可. 这种解法 ...

  5. [Swift]LeetCode863. 二叉树中所有距离为 K 的结点 | All Nodes Distance K in Binary Tree

    We are given a binary tree (with root node root), a targetnode, and an integer value K. Return a lis ...

  6. 【前缀思想】二叉树中所有距离为 K 的结点

    863. 二叉树中所有距离为 K 的结点 class Solution { Map<TreeNode,String>map=new HashMap<>(); String pa ...

  7. 洛谷 P3806 【模板】点分治1-树分治(点分治,容斥版) 模板题-树上距离为k的点对是否存在

    P3806 [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入格式 n,m 接下来n-1条边a,b,c描述a到b有一条长度 ...

  8. addListener添加事件监听器,第三个参数useCapture (Boolean) 的作用

    addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture,本文 ...

  9. 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

    关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个 ...

  10. 【转】三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

    关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个 ...

随机推荐

  1. 用VUE框架开发的准备

    使用VUE框架编写项目的准备工作 防止我几天不打代码,忘记怎么打了 下载小乌龟拉取码云项目文件,用于码云仓库代码提交与拉取(可以不安装) 小乌龟要设置你的码云账号 密码 在控制面版 中 凭证里可以修改 ...

  2. Python项目案例开发从入门到实战-1.5Python文件的使用

    Python对文件的操作通常按照三个步骤进行: un 使用open()函数打开(或建立)文件,并返回一个file对象. deux 使用file对象的读写方法对文件进行读写操作. trois 使用fil ...

  3. TCP粘包和拆包

    假设客户端分别发送了两个数据包D1和D2给服务器,由于服务器一次读取的字节数是不确定的,故可能存在以下4中情况: 服务端分两次读到了两个独立的数据包D1和D2,没有粘包和拆包 服务端分一次收到两个数据 ...

  4. Java-02对象传递和返回

    Java-02对象传递和返回 当你在"传递"一个对象的时候,你实际上是在传递它的引用 1引用 1.1传递引用 当你将一个引用传给方法后,该引用指向的仍然是原来的对象: /** * ...

  5. 关于Android开发工具的下载之SDK篇

    SDK的下载 需要注意的是,如果我们使用的是Eciplise工具的话,那我们需要下载版本较低的android SDK tools, 在这里把下载链接放在这里啦:https://link.csdn.ne ...

  6. SpringBoot——静态资源及原理

    一.使用 SpringBoot 的步骤 [1]创建 SpringBoot应用,选中自己需要的模块.[2]SpringBoot 已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运行起来.[ ...

  7. 深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析

    深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析 在本篇文章当中主要给大家介绍在 cpython 内部,bytes 的实现原理.内存布局以及与 bytes 相关的一个比较重要的优 ...

  8. 剑指offer 第 17 天

    第 17 天 排序(中等) 剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3. ...

  9. JS中我们为什么要new个实例而不直接执行

    正常情况:<script> function sayHello() { alert("hello") } sayHello();直接调用他 </script> ...

  10. LabVIEW之同步——集合点vi

    这是一个对我来讲比较偏的工具,做过很多项目,没有用它也能完成各种各样的项目. 今天我们一起来了解下这个工具,所以称之为工具,因为它属于NI LabVIEW的白色节点,一般是有官方利用LabVIEW代码 ...