leetcode--------All Nodes Distance K in Binary Tree

博客围绕LeetCode题目展开,指出解题不能硬写,要利用结构。解题思路是用map记录父亲节点,仅记录target节点路径的父亲节点会使问题复杂。找节点时根据K的长度递归深度,需用容器记录节点是否已访问,还可对路径上的父亲节点按K深度递归。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我写了一下,大体的逻辑是对的,但是要学会利用结构,而不是硬写,逻辑本来很简单,但也让你搞得很复杂!

这题得思路是,这就相当于一个单向的,不能访问父亲节点,所以我必须用一个map来记录所有的父亲节点,而我只是单纯的把只关于target的节点的一条路径的父亲节点给记录下来,这样也让我写的更加复杂,

而接下来的找的过程,也就是根据K的长度,递归K的深度,如果不为空,则record,关于父亲节点的递归,需要记录其这个节点是已访问的,就不能在访问了,就要递归它的另一个孩子,所以还需要一个容器来记录该节点是否已访问!!

一条路径上的父亲节点也可以这样根据K的深度进行递归!

下面的这个算法的描述是看了别人的解法思路写的。

class Solution {
public:
	

	std::vector<int> result;
	std::map< TreeNode*, TreeNode*> par_chil;
	std::set<TreeNode*> visitied;
	//利用层次遍历,其实也就是广度搜索,找到所有的父亲
	void find_parent(TreeNode* root)
	{
		if (!root)	return;
	
			if (root->left)
			{
				par_chil[root->left] = root;
				find_parent(root->left);
			}
			if (root->right)
			{	
				par_chil[root->right] = root;
				find_parent(root->right);
			}
				
			
			
		
		
	}

	void dfs(TreeNode* root, int curr_i)
	{
		if (!root)	return;	//递归基
		if (curr_i==0) {
			result.emplace_back(root->val);
			return;
		}
		visitied.insert(root);
		if (root->left&&(visitied.find(root->left)==visitied.end()))	dfs(root->left, curr_i - 1);
		if (root->right && (visitied.find(root->right) == visitied.end()))	dfs(root->right, curr_i - 1);
		TreeNode* parent = par_chil[root];
		if(parent&&visitied.find(parent) == visitied.end())	dfs(parent, curr_i - 1);
	}

	vector<int> distanceK(TreeNode* root, TreeNode* target, int K) {
		find_parent(root);
		dfs(target, K);
		return result;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值