力扣(863)--------------二叉树中所有距离为 K 的结点

该博客详细介绍了如何解决在给定二叉树中找到距离目标节点K步的所有节点的问题。首先遍历二叉树构建节点与其父节点的关系映射,然后从目标节点出发,通过深度优先搜索策略,沿着左右子节点和父节点方向查找,直到找到距离为K的节点。在搜索过程中,为了避免重复访问,引入了来源节点作为递归参数。最终,所有符合条件的节点值被收集并返回。
摘要由CSDN通过智能技术生成

二叉树中所有距离为 K 的结点

1、题目

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。

返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

img

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
输出:[7,4,1]
解释:
所求结点为与目标结点(值为 5)距离为 2 的结点,
值分别为 7,4,以及 1

注意,输入的 “root” 和 “target” 实际上是树上的结点。
上面的输入仅仅是对这些对象进行了序列化描述。

提示:

给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.

2、题解

  1. 先遍历一遍二叉树,将每个节点的父节点存入hashmap中
Map<TreeNode,TreeNode>mp=new HashMap<>();
void dfs(TreeNode node){
		if(node.left!=null){
			mp.put(node.left,node);
			dfs(node.left);
		}if(node.right!=null){
			mp.put(node.right,node);
			dfs(node.right);
		}
	}
  1. 再以目标节点target开始,向左向右,向上(向父节点)搜索,直到所求节点与target节点距离为k,值得注意的是,由于每个结点值都是唯一的,为避免在深度优先搜索时重复访问结点,递归时额外传入来源结点 from,在递归前比较目标结点是否与来源结点相同。

    void dfsVal(TreeNode node,TreeNode parent,int step,int k){
    		if(step==k){
    			list.add(node.val);
    			return;
    		}
    		if(node.right!=null&&node.right!=parent){
    			dfsVal(node.right,node,step+1,k);
    		}
    		if(node.left!=null&&node.left!=parent){
    			dfsVal(node.left,node,step+1,k);
    		}
    		if(mp.get(node)!=null&&mp.get(node)!=parent){
    			dfsVal(mp.get(node),node,step+1,k);
    		}
    	}
    

    综上所诉

    class Solution {
       Map<TreeNode,TreeNode>mp=new HashMap<>();
    	List<Integer>list=new ArrayList<>();
    	public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
    
    		dfs(root);
    		dfsVal(target,null,0,k);
            return list;
    
    	}
    	void dfs(TreeNode node){
    		if(node.left!=null){
    			mp.put(node.left,node);
    			dfs(node.left);
    		}if(node.right!=null){
    			mp.put(node.right,node);
    			dfs(node.right);
    		}
    	}
    	void dfsVal(TreeNode node,TreeNode parent,int step,int k){
    		if(step==k){
    			list.add(node.val);
    			return;
    		}
    		if(node.right!=null&&node.right!=parent){
    			dfsVal(node.right,node,step+1,k);
    		}
    		if(node.left!=null&&node.left!=parent){
    			dfsVal(node.left,node,step+1,k);
    		}
    		if(mp.get(node)!=null&&mp.get(node)!=parent){
    			dfsVal(mp.get(node),node,step+1,k);
    		}
    	}
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值