文章目录

  • 1、题目描述
  • 2、解题思路
  • 3、解题代码

1、题目描述

2、解题思路

  如果题目这样说:从值为 k 的结点的子树中,找出距离它最近的叶子节点,相信所有人都能秒杀这道题,直接 BFS 即可。

  本题的难点在于,它是从整棵树中找距离值为 k 的结点最近的叶子节点。它可能是这样的:

  很明显,绿色的叶子节点就是距离 k 最近的那个。

  我们的 BFS 原理是:处理好当前节点,则把它对其他节点的引用入队。

  如果我们从节点 k 出发,按照二叉树的结构,是无法访问到图中绿色的节点。

  因此,我们来修改二叉树的结构如下:

  画的有点难看,其实就是把原来二叉树每个节点只能指向左右子结点改为增加指向父结点的指针。

  这样,从节点 k 出发进行 BFS ,第一个遇到的叶子节点就是绿色的那个。

3、解题代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public int findClosestLeaf(TreeNode root, int k) {Map<TreeNode, List<TreeNode>> graph = new HashMap();dfs(graph, root, null);Queue<TreeNode> queue = new LinkedList();Set<TreeNode> seen = new HashSet();// 找到值为 k 的节点,把它当成 bfs 的起点for (TreeNode node : graph.keySet()) {if (node != null && node.val == k) {queue.add(node);seen.add(node);}}while (!queue.isEmpty()) {TreeNode node = queue.poll();if (node != null) {if (graph.get(node).size() <= 1) {return node.val;}for (TreeNode nei : graph.get(node)) {if (!seen.contains(nei)) {seen.add(nei);queue.add(nei);}}}}// while 里面一定有 return,这里只是让编译器通过throw null;}/*** 原来的 TreeNode 结构只有两个左右子结点索引* 经过 dfs 函数后生成 graph,它是一个 Map,key 为 二叉树的任意一个 node,value 为它的左子节点、右子节点、父结点* 需要把二叉树转为 graph 就是为了 BFS 用,因为不仅往左右子树走,还得往父结点走** @param graph* @param node* @param parent*/public void dfs(Map<TreeNode, List<TreeNode>> graph, TreeNode node, TreeNode parent) {if (node != null) {if (!graph.containsKey(node)) graph.put(node, new LinkedList<TreeNode>());if (!graph.containsKey(parent)) graph.put(parent, new LinkedList<TreeNode>());graph.get(node).add(parent);graph.get(parent).add(node);dfs(graph, node.left, node);dfs(graph, node.right, node);}}
}

【LeetCode - 742】二叉树最近的叶节点相关推荐

  1. LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点. 这里,与叶结点 最近 表示在二叉树中到达该叶节点需要行进 ...

  2. Leetcode 742.二叉树最近的叶子结点

    Time: 20190924 Type: Medium 题目描述 给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点. 这里,与叶结点 最近 表示在二叉树中 ...

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

    Time: 20190924 Type: Medium 题目描述 给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K . 返回到目标结点 target 距离为 K ...

  4. 7-1 叶节点求和 (30 分)

    对给定的有N个节点(N>=0)的二叉树,求叶节点元素之和. 输入格式: 第一行是一个非负整数N,表示有N个节点 第二行是一个整数k,是树根的元素值 接下来有N-1行,每行是一个新节点,格式为 r ...

  5. 求叶节点带权路径长度之和

    题目:二叉树的带权路径长度(WPL)是二叉树中所有叶节点的带权路径长度之和.给定一颗二叉树T,采用二叉链表存储,节点结构为            left weight right           ...

  6. 叶节点到根节点的路径_所有根到叶路径

    叶节点到根节点的路径 Problem statement: 问题陈述: Given a Binary Tree of size N, write a program that prints all t ...

  7. PTA 7-9 叶节点求和 (20 分)

    PTA 7-9 叶节点求和 (20 分) 对给定的有N个节点(N>=0)的二叉树,求叶节点元素之和 没有当过父节点的节点都是叶子节点 #include <iostream> #inc ...

  8. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  9. LeetCode 1123. 最深叶节点的最近公共祖先(递归比较子树高度)

    1. 题目 给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先. 回想一下: 叶节点 是二叉树中没有子节点的节点 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 ...

最新文章

  1. 深入卷积神经网络背后的数学原理 | 技术头条
  2. cufflinks基于QuantFig绘制高级金融图
  3. flask-admin 快速打造博客 系列一
  4. 最简单的彩灯管理系统
  5. 免费下载来自阿里巴巴 双11 的《云原生大规模应用落地指南》
  6. 如何在android studio中设置sdk path?
  7. Amber Group散户投资APP资管规模超10亿美元
  8. java基础01-java历史
  9. 56个民族HTML代码
  10. 爬虫——Scrapy框架案例二:阳光问政平台
  11. 自媒体是什么?三大媒体平台详细介绍,不了解的赶紧看着吧!
  12. lucas定理 与 扩展lucas定理(HDU 3037 以及 2015 ICL, Finals, Div. 1 J.Ceizenpok’s formula)
  13. Check Point设置允许外网通过指定端口访问服务器
  14. 五一假期维修手机感想
  15. 【FPGA】十一、I2C通信回环
  16. 《LightGBM: A Highly Efficient Gradient Boosting Decision Tree》论文笔记
  17. dns被劫持怎么办,一文说清dns劫持与防御
  18. python哪个找工作最好_为何python不好找工作
  19. 版权费用外流,中国音乐产业被境外唱片公司收割?
  20. matalb曲线图只有点没有线_身高170公分,体重170磅的女孩,身材健硕,没有一点多余赘肉...

热门文章

  1. C# 利用ReportViewer生成报表
  2. BundleFusion使用Intel RealSense D435i深度相机实现
  3. java创建完全二叉树
  4. 推荐一款Go语言Web开发框架
  5. 随笔集:微信小程序的微信支付
  6. Centos编译加载toa模块
  7. [CF817F]MEX Queries
  8. ThinkPad和ThinkCentre预装系统操作系统分区大小调整工具20090804版
  9. 【智能算法】RBF网络的回归-非线性函数回归的实现
  10. 缓冲区溢出(栈溢出)