博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
距离为K的节点 All Nodes Distance K in Binary Tree
阅读量:4974 次
发布时间:2019-06-12

本文共 2597 字,大约阅读时间需要 8 分钟。

2018-07-26 17:38:37

问题描述:

问题求解:

解法一、

第一种解法是使用Graph + BFS。换言之,就是将二叉树转化为无向图,然后在无向图中使用BFS进行层次遍历即可。

这种解法是比较直观的解法,是必须要进行掌握的,时间复杂度为O(n)。

public List
distanceK(TreeNode root, TreeNode target, int K) { HashMap
> graph = new HashMap<>(); List
res = new ArrayList<>(); buildGraph(graph, null, root); Set
visited = new HashSet<>(); Queue
q = new LinkedList<>(); visited.add(target); q.add(target); int k = -1; while (!q.isEmpty() && k <= K) { int sz = q.size(); k++; for (int i = 0; i < sz; i++) { TreeNode cur = q.poll(); if (k == K) res.add(cur.val); ArrayList
ls = graph.get(cur); for (TreeNode t : ls) { if (!visited.contains(t)) { q.add(t); visited.add(t); } } } } return res; } private void buildGraph(HashMap
> graph, TreeNode parent, TreeNode child) { if (child == null) return; graph.put(child, new ArrayList<>()); if (parent != null) { graph.get(parent).add(child); graph.get(child).add(parent); } buildGraph(graph, child, child.left); buildGraph(graph, child, child.right); }

 

解法二、

第二种解法自然就是递归解法了,本题的递归解法还是有点难度的,首先需要计算的是root 到 target的距离,如果距离值正好等于 K,那么就将当前的节点加入res,否则在另一个子树中进行collection。其次如果遍历到target,那么直接对target进行collection。

public List
distanceK(TreeNode root, TreeNode target, int K) { List
res = new ArrayList<>(); distance(root, target, K, res); return res; } private int distance(TreeNode root, TreeNode target, int K, List
res) { if (root == null) return -1; if (root == target) { collection(target, K, res); return 0; } int l = distance(root.left, target, K, res); int r = distance(root.right, target, K, res); if (l >= 0) { if (l == K - 1) res.add(root.val); collection(root.right,K - l - 2, res); return l + 1; } if (r >= 0) { if (r == K - 1) res.add(root.val); collection(root.left, K - r - 2, res); return r + 1; } return -1; } private void collection(TreeNode root, int K, List
res) { if (root == null || K < 0) return; if (K == 0) { res.add(root.val); return; } collection(root.left, K - 1, res); collection(root.right, K - 1, res); }

 

转载于:https://www.cnblogs.com/TIMHY/p/9373297.html

你可能感兴趣的文章
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Spring中使用Velocity模板
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
分布式锁的三种实现方式
查看>>
poj 2109 pow函数也能这么用?p的开n次方
查看>>
Oracle database link
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>
POJ 1703 Find them, Catch them【种类/带权并查集+判断两元素是否在同一集合/不同集合/无法确定+类似食物链】...
查看>>
L1-5. A除以B【一种输出格式错了,务必看清楚输入输出】
查看>>
Git一分钟系列--快速安装git客户端
查看>>
纵越6省1市-重新启动
查看>>