前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)

LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)

作者头像
Michael阿明
发布2020-07-13 14:39:18
1.2K0
发布2020-07-13 14:39:18
举报

1. 题目

给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点。

这里,与叶结点 最近 表示在二叉树中到达该叶节点需要行进的边数与到达其它叶结点相比最少。 而且,当一个结点没有孩子结点时称其为叶结点。

在下面的例子中,输入的树以逐行的平铺形式表示。 实际上的有根树 root 将以TreeNode对象的形式给出。

代码语言:javascript
复制
示例 1:
输入:
root = [1, 3, 2], k = 1
二叉树图示:
          1
         / \
        3   2

输出: 2 (或 3)
解释: 2 和 3 都是距离目标 1 最近的叶节点。
 
示例 2:
输入:
root = [1], k = 1
输出:1
解释: 最近的叶节点是根结点自身。
 
示例 3:
输入:
root = [1,2,3,4,null,null,null,5,null,6], k = 2
二叉树图示:
             1
            / \
           2   3
          /
         4
        /
       5
      /
     6

输出:3
解释: 值为 3(而不是值为 6)的叶节点是距离结点 2 的最近结点。
 
注:
root 表示的二叉树最少有 1 个结点且最多有 1000 个结点。
每个结点都有一个唯一的 node.val ,范围为 [1, 1000]。
给定的二叉树中有某个结点使得 node.val == k。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/closest-leaf-in-a-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • dfs 建立父节点信息,找到 k 节点,加入队列
  • BFS,向子节点和父节点进行BFS搜索,第一个找到的叶子节点为答案
代码语言:javascript
复制
class Solution {
	unordered_map<TreeNode*,TreeNode*> father;
	queue<TreeNode*> q;
	unordered_set<TreeNode*> visited;
public:
    int findClosestLeaf(TreeNode* root, int k) {
    	father[root] = NULL;
    	dfs(root, k);
    	int size;
    	TreeNode* cur;
    	while(!q.empty())
    	{
    		size = q.size();
    		while(size--)
    		{
    			cur = q.front();
    			q.pop();
    			if(!cur->left && !cur->right)
    				return cur->val;
    			if(cur->left && !visited.count(cur->left))
    			{
    				q.push(cur->left);
    				visited.insert(cur->left);
    			}
    			if(cur->right && !visited.count(cur->right))
    			{
    				q.push(cur->right);
    				visited.insert(cur->right);
    			}
    			if(father[cur] && !visited.count(father[cur]))
    			{
    				q.push(father[cur]);
    				visited.insert(father[cur]);
    			}
    		}
    	}
    	return -1;
    }
    void dfs(TreeNode* root, int k) 
    {
    	if(!root) return;
    	if(root->val == k)
    	{
    		q.push(root);
    		visited.insert(root);
    	}
    	if(root->left)
    		father[root->left] = root;
    	if(root->right)
    		father[root->right] = root;
    	dfs(root->left,k);
    	dfs(root->right,k);
    }
};

28 ms 22.9 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档