LeetCode - Medium - 863

}

if(++count == remainder) {

queue.stream().forEach(a->result.add(a.val));

break;

}

}

}else if(remainder == 0) {

result.add(currentNode.val);

}

}

}

public void findDown(int k, TreeNode startNode, List result) {

if(k == 0) {//findUp不用,只一个即可

result.add(startNode.val);

return;

}

LinkedList queue = new LinkedList<>();

queue.offer(startNode);

int count = 0;

while(!queue.isEmpty()) {

for(int size = queue.size(); size > 0; size–) {

TreeNode node = queue.poll();

if(node.left != null)

queue.offer(node.left);

if(node.right != null)

queue.offer(node.right);

}

if(++count == k) {

queue.stream().forEach(a->result.add(a.val));

break;

}

}

}

//目标节点到跟节点的路径

@SuppressWarnings(“unchecked”)

public LinkedList findTarget(TreeNode root, TreeNode target){

LinkedList<Object[]> stack = new LinkedList<>();

stack.push(new Object[] {root, new LinkedList()});

while(!stack.isEmpty()) {

Object[] arr = stack.pop();

TreeNode node = (TreeNode)arr[0];

LinkedList path = (LinkedList)arr[1];

path.add(node);

if(node.val == target.val)

return path;

if(node.left != null && node.right == null) {

stack.push(new Object[] {node.left, path});

}

if(node.left == null && node.right != null) {

stack.push(new Object[] {node.right, path});

}

if(node.left != null && node.right != null) {

stack.push(new Object[] {node.right, new LinkedList(path)});

stack.push(new Object[] {node.left, path});

}

}

return new LinkedList();

}

//方法二:别人写的

public static class Solution1{

Map<TreeNode, Integer> map = new HashMap<>();

public List distanceK(TreeNode root, TreeNode target, int K) {

List res = new LinkedList<>();

find(root, target);

dfs(root, K, map.get(root), res);

return res;

}

// find target node first and store the distance in that path that we could use it later directly

private int find(TreeNode root, TreeNode target) {

if (root == null) return -1;

if (root.val == target.val) {

map.put(root, 0);

return 0;

}

int left = find(root.left, target);

if (left >= 0) {

map.put(root, left + 1);

return left + 1;

}

int right = find(root.right, target);

if (right >= 0) {

map.put(root, right + 1);

return right + 1;

}

return -1;

}

private void dfs(TreeNode root, int K, int length, List res) {

if (root == null) return;

if (map.containsKey(root)) length = map.get(root);

if (length == K) res.add(root.val);

dfs(root.left, K, length + 1, res);

dfs(root.right, K, length + 1, res);

}

}

//方法三:别人写的2,方法二缝合版

public static class Solution2{

public List distanceK(TreeNode root, TreeNode target, int K) {

List res = new LinkedList<>();

if (K == 0) {

res.add(target.val);

} else {

dfs(res, root, target.val, K ,0);

}

return res;

}

private int dfs(List res, TreeNode node, int target, int K, int depth) {

if (node == null) return 0;

if (depth == K) {

res.add(node.val);

return 0;

}

int left, right;

if (node.val == target || depth > 0) {

left = dfs(res, node.left, target, K, depth + 1);

right = dfs(res, node.right, target, K, depth + 1);

} else {

left = dfs(res, node.left, target, K, depth);

right = dfs(res, node.right, target, K, depth);

}

if (node.val == target) return 1;

if (left == K || right == K) {

res.add(node.val);

return 0;

}

if (left > 0) {

dfs(res, node.right, target, K, left + 1);

return left + 1;

}

if (right > 0) {

dfs(res, node.left, target, K, right + 1);

return right + 1;

}

return 0;

}

}

}

Test


import static org.junit.Assert.*;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import org.hamcrest.collection.IsEmptyCollection;

import org.hamcrest.collection.IsIterableContainingInAnyOrder;

import org.junit.Test;

import com.lun.medium.AllNodesDistanceKInBinaryTree.Solution1;

import com.lun.medium.AllNodesDistanceKInBinaryTree.Solution2;

import com.lun.util.BinaryTree;

import com.lun.util.BinaryTree.TreeNode;

public class AllNodesDistanceKInBinaryTreeTest {

@Test

public void test() {

AllNodesDistanceKInBinaryTree obj = new AllNodesDistanceKInBinaryTree();

TreeNode root = BinaryTree.integers2BinaryTree(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4);

assertThat(obj.distanceK(root, new TreeNode(5), 2), IsIterableContainingInAnyOrder.containsInAnyOrder(7,4,1));

}

@Test

public void test2() {

Solution1 obj = new Solution1();

TreeNode root = BinaryTree.integers2BinaryTree(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4);

assertThat(obj.distanceK(root, new TreeNode(5), 2), //

IsIterableContainingInAnyOrder.containsInAnyOrder(7,4,1));

}

@Test

public void test3() {

Solution2 obj = new Solution2();

TreeNode root = BinaryTree.integers2BinaryTree(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4);

assertThat(obj.distanceK(root, new TreeNode(5), 2), //

IsIterableContainingInAnyOrder.containsInAnyOrder(7,4,1));

}

@Test

public void testFind() {

AllNodesDistanceKInBinaryTree obj = new AllNodesDistanceKInBinaryTree();

TreeNode root = BinaryTree.integers2BinaryTree(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4);

StringBuilder sb = new StringBuilder();

obj.findTarget(root, new TreeNode(4)).forEach(a->sb.append(a.val+“,”));

assertEquals(“3,5,2,4,”, sb.toString());

StringBuilder sb2 = new StringBuilder();

obj.findTarget(root, new TreeNode(8)).forEach(a->sb2.append(a.val+“,”));

assertEquals(“3,1,8,”, sb2.toString());

StringBuilder sb3 = new StringBuilder();

obj.findTarget(root, new TreeNode(5)).forEach(a->sb3.append(a.val+“,”));

assertEquals(“3,5,”, sb3.toString());

assertThat(obj.findTarget(root, new TreeNode(9)), IsEmptyCollection.empty());

StringBuilder sb4 = new StringBuilder();

obj.findTarget(root, new TreeNode(3)).forEach(a->sb4.append(a.val+“,”));

assertEquals(“3,”, sb4.toString());

}

@Test

public void testFindUp() {

AllNodesDistanceKInBinaryTree obj = new AllNodesDistanceKInBinaryTree();

TreeNode root = BinaryTree.integers2BinaryTree(3, 5, 1, 6, 2, 0, 8, null, null, 7, 4);

LinkedList path = obj.findTarget(root, new TreeNode(5));

List result = new ArrayList<>();

obj.findUp(3, path, result);

assertThat(result, IsIterableContainingInAnyOrder.containsInAnyOrder(0, 8));

List result2 = new ArrayList<>();

obj.findUp(2, path, result2);

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-1lG16yu8-1715551164881)]

[外链图片转存中…(img-7u1cLzu7-1715551164882)]

[外链图片转存中…(img-9CIj2Eeb-1715551164882)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
插件名字叫leetcode editor,可以解决在上班时想刷leetcode但又不想直接打开leetcode界面太扎眼或者无法debug的问题。你可以在IDEA的plugins中搜索并下载leetcode editor插件。 插件的下载地址是https://plugins.jetbrains.com/plugin/12132-leetcode-editor。 下载并安装插件后,你可以在IDEA的File -> Settings -> Tools -> Leetcode Plugin***com作为网址选项。此外,你还可以选择代码类型,包括Java、Python、C、Python3、C、C#、JavaScript、Ruby、Swift、Go、Scala、Kotlin、Rust、PHP。你需要输入登录名和密码来登录leetcode账号,并可以设置临时文件的存放目录和HTTP Proxy。 如果你想自定义代码模板,可以参考该插件提供的自定义代码模板文档(https://github.com/shuzijun/leetcode-editor/blob/master/doc/CustomCode.md)。通过这个插件,你可以方便地在IDEA中刷leetcode,并享受更好的调试体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [好用的idea插件leetcode editor【详细安装指南】](https://blog.csdn.net/weixin_45988401/article/details/129170239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [IDEA插件系列(112):LeetCode Editor插件——LeetCode编辑器](https://blog.csdn.net/cnds123321/article/details/119859448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值