LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点。
每个节点的值为 1 到 n 中的一个整数,且互不相同。
给你一个整数 startValue ,表示起点节点 s 的值,和另一个不同的整数 destValue ,表示终点节点 t 的值。
请找到从节点 s 到节点 t 的 最短路径 ,并以字符串的形式返回每一步的方向。
每一步用 大写 字母 ‘L’ ,‘R’ 和 ‘U’ 分别表示一种方向:
'L'
表示从一个节点前往它的 左孩子 节点。'R'
表示从一个节点前往它的 右孩子 节点。'U'
表示从一个节点前往它的 父 节点。
请你返回从 s 到 t 最短路径 每一步的方向。
示例 1:
输入:root = [5,1,2,3,null,6,4],
startValue = 3, destValue = 6
输出:"UURL"
解释:最短路径为:3 → 1 → 5 → 2 → 6 。
示例 2:
输入:root = [2,1], startValue = 2, destValue = 1
输出:"L"
解释:最短路径为:2 → 1 。提示:
树中节点数目为 n 。
2 <= n <= 10^5
1 <= Node.val <= n
树中所有节点的值 互不相同 。
1 <= startValue, destValue <= n
startValue != destValue
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/step-by-step-directions-from-a-binary-tree-node-to-another
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 先求解两个点的最小公共祖先 p
- 然后 dfs1 求解 p 到 start 的步数 x,得到答案有 x 个
U
- 再 dfs2 求解 p 到 end 的路径,就是答案的 后半部分
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {int stepdowntofindstart = -1;bool finddest = false;string pathtodest, path;
public:string getDirections(TreeNode* root, int startValue, int destValue) {TreeNode* p = lowestcommonParent(root, startValue, destValue);dfs1(p, startValue, 0);dfs2(p, destValue);if(stepdowntofindstart)return string(stepdowntofindstart, 'U') + pathtodest;return pathtodest;}TreeNode* lowestcommonParent(TreeNode* root, int sv, int dv){ // 最小公共祖先if(!root) return root;if(root->val == sv || root->val == dv)return root;auto l = lowestcommonParent(root->left, sv, dv);auto r = lowestcommonParent(root->right, sv, dv);if(l && r) return root;return l ? l : r;}void dfs1(TreeNode* root, int sv, int step){ // 最小祖先到 start 的步数if(stepdowntofindstart != -1 || !root) return;if(root->val == sv){stepdowntofindstart = step;return;}dfs1(root->left, sv, step+1);dfs1(root->right, sv, step+1);}void dfs2(TreeNode* root, int dv){ // 最小祖先到 end 的路径 pathif(finddest || !root) return;if(root->val == dv){finddest = true;pathtodest = path;return;}path.push_back('L');dfs2(root->left, dv);path.pop_back();path.push_back('R');dfs2(root->right, dv);path.pop_back();}
};
164 ms 111.3 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 2096. 从二叉树一个节点到另一个节点每一步的方向(最小公共祖先)相关推荐
- 两节点的最小公共祖先LCA
一.二叉搜索树中两节点的最小公共祖先: 最初级的题目,在一颗二叉搜索树中寻找两节点的最小公共祖先.根据二叉搜索树的特征,从根节点开始查找,若两节点的val值都小于当前节点,则他们的最小公共祖先就去左子 ...
- 二叉树 最小公共祖先 c++版
LCA(最近公共祖先)算法的逻辑是基于递归的思想来实现的.在这个代码中,我们使用分治策略来寻找给定节点 p 和 q 的最近公共祖先.具体原理如下: 如果当前根节点为 -1,表示树为空,返回 -1,表示 ...
- LeetCode 1257. 最小公共区域(最小公共祖先)
文章目录 1. 题目 2. 解题 1. 题目 给你一些区域列表 regions ,每个列表的第一个区域都包含这个列表内所有其他区域. 很自然地,如果区域 X 包含区域 Y ,那么区域 X 比区域 Y ...
- LeetCode 1650. 二叉树的最近公共祖先 III(哈希)
文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树中的两个节点 p 和 q,返回它们的最近公共祖先节点(LCA). 每个节点都包含其父节点的引用(指针).Node 的定义如下: class ...
- 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...
- 算法攻关 - 二叉树的最近公共祖先 (O(n))_236
文章目录 一.题目描述 二.思路 三.代码实现 四.小结 一.题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先.百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 ...
- [二叉树] 二叉树的最近公共祖先--leetcode236
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x 是 p.q 的祖先且 ...
- leetcode题解236-二叉树的最近公共祖先
问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x 是 p.q ...
最新文章
- 运筹学(最优化理论)学习笔记 | 分支定界法
- 开盘即破发,网易有道赴美上市,继续发力在线教育
- Luogu P3321 [SDOI2015]序列统计
- 带你深入理解分布式事务,掌握后台分布式核心技术,PS:送5本!
- SpringMVC+hibernate+mysql+EASYUI的登陆+CRUD
- HDU 6321 Problem C. Dynamic Graph Matching (状压dp)
- 按120分计算成绩 mysql_Mysql实用教程试卷B.doc
- Spring Data Jpa出现“Table ‘XXX.hibernate_sequence‘ doesn‘t exist”
- MySQL百万级高并发网站优化
- 【翻译】优秀网站的10个技巧
- ofo走出校园观察:市场定位导致产品错位?
- 07_封装丶静态和工具类
- ngrok 通过外网链接映射到本地机器,支持http,https
- 独自一人开发返利平台小程序日记(准备开源中):万事开头难,既然做了,那就只能咬牙坚持了
- linux 主机卫士安装及使用
- 新西兰计算机预科学费,新西兰留学预科学费
- Three.js(十二)——骨骼动画、变形动画
- 希腊神话:希腊众神 宙斯和赫拉
- 达人评测 R5 7530U和i5 1240p选哪个好
- 金仓数据库KingbaseES表空间(tablespace)知多少
热门文章
- fiber报错 (type *big.Int has no field or method FillBytes)
- python中格式化字符串
- 配置hiveserver2访问hive
- ap模式和sta模式共存_AP+AC组网下的本地转发及集中转发
- C++的迭代器Interator
- iOS关于armv7,armv7s,arm64,i386,x86_64等问题
- 逆水寒7月19服务器维护,逆水寒7月19日更新维护公告 更新内容汇总
- 用计算机计算出密码,自带计算器的密码
- c语言实现线性表的算法,数据结构算法代码实现——线性表的定义(一)
- C语言srand((unsigned)time(NULL))…