leetcode中863. 二叉树中所有距离为 K 的结点解题笔记(java实现)

一、先看懂题目

在这里插入图片描述

  • 树结构
  • public class TreeNode {
  • int val;
    
  • TreeNode left;
    
  • TreeNode right;
    
  • TreeNode(int x) { val = x; }
    
  • }

二、分析:

解此题,首先target节点距离为k的节点可分为两部分,target上方的节点和下方的节点,对于target下方节点,通过广度遍历便可得到,对于上方节点需要找到父节点在进行深度遍历,此时进行遍历的时候,不需要遍历target节点一侧的子树。
第一步,首先需要遍历target上方的整个树,用map进行保存父节点和子节点的映射,因为需要用子节点找到父节点,所以key为子节点,value为父节点。
第二步,如果找距离targer层k步的节点,在target下方的需要查找的节点就在target下的第k层,通过深度遍历便可得到,对于target上方的节点,可以看作target的父辈节点的第k-i层,i为target与父辈节点的距离,此时访问时需要把target所在路径排除,这样就可以做出这道题
代码如下

class Solution {
    Map<TreeNode,TreeNode > routeMap = new HashMap<>();
    List<Integer> result = new ArrayList();
    public void nodeConnect(TreeNode fatherNode,TreeNode tempNode){
        routeMap.put(tempNode,fatherNode);
    }
    public void ergodic(TreeNode fatherNode,TreeNode tempNode){
        if(tempNode == null) return ;
        nodeConnect(fatherNode,tempNode);
        fatherNode = tempNode;
        ergodic(fatherNode,tempNode.left);
        ergodic(fatherNode,tempNode.right);
    }
    public void seekNode(TreeNode srcNode,int k){
        if(srcNode == null) return;
        if(k == 0){
            result.add(srcNode.val);
            return;
        }
        seekNode(srcNode.left,k-1);
        seekNode(srcNode.right,k-1);
    }
    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        TreeNode fatherNode = null;
        ergodic(fatherNode,root);
        seekNode(target,k);
        fatherNode = routeMap.get(target);
        while(k>=1 && fatherNode != null){
            if(fatherNode.left == target){
                fatherNode.left = null;
            }else{
                fatherNode.right = null;
            }
            seekNode(fatherNode,--k);
            target = fatherNode;
            fatherNode = routeMap.get(fatherNode);
        }
        return result;
    }
}

执行用时:14 ms, 在所有 Java 提交中击败了76.52%的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了44.21%的用户
未到双百可以继续优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值