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. 【BUUCTF】ACTF2020 新生赛Include1 write up

    查看源代码+抓包都没有发现什么信息,只有这两个东东 <meta charset="utf8"> Can you find out the flag? <meta ...

  2. Java 比较两个对象的不同之处(old, new) 包含 bean 对象下的 list, Map , bean 的细节

    Java  比较两个对象的不同之处(old, new)   包含 bean 对象下的 list, Map , bean 的细节 package com.icil.pinpal.test1; impor ...

  3. Centos6、7修改主机名

    centos6 1.临时修改 hostname node1 2.永久生效 , 修改/etc/sysconfig/network 文件 HOSTNAME=node1 3.修改 /etc/hosts文件 ...

  4. Quine-McCluskey两级逻辑化简算法原理解析

    转载请务必注明出处:https://www.cnblogs.com/the-wind/p/15764283.html 目录 1 背景介绍:两级逻辑 2 Quine-McCluskey两级逻辑化简 2. ...

  5. Ubuntu18.04二进制安装elasticsearch

    1. 什么是Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎.Logstash 和 Beats 有助于收集.聚合和丰富您的数据并将 ...

  6. HashMap正确遍历方式,千万不要再forforfor啦!!!

    for (int i = 0; i < map.size(); i++) { if (map.get(i)/n>=0.01) { num++; } } 上述代码报空指针异常.为什么? 循环 ...

  7. ECC(SM2) 简介及 C# 和 js 实现【加密知多少系列】

    〇.简介 椭圆曲线密码学(Elliptic curve cryptography:ECC),一种建立公开密钥加密的演算法,基于椭圆曲线数学.利用有限域上椭圆曲线的点构成的 Abel 群离散对数难解性, ...

  8. Java面向对象--接口和多态

    final 关键字 最终修饰符 可以修饰 类 方法 变量 被final修饰后不能被继承 重写 二次赋值 修饰类时 该类不可以被继承 修饰方法时 该方法不能被重写 修饰变量时, 该变量只能赋值一次, 不 ...

  9. python入门教程之十三错误和异常

    作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和异常. Python as ...

  10. Java内部类的使用介绍详解

    前言 在之前讲解static静态内部类时,就给大家简单说过内部类的概念.但实际上,内部类并不是那么简单,所以今天我们需要对内部类进行专门地讲解和学习. 全文大约 [6500]字,不说废话,只讲可以让你 ...