开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
从二叉树一个节点到另一个节点每一步的方向
给你一棵 二叉树 的根节点 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 <= 105
- 1 <= Node.val <= n
- 树中所有节点的值 互不相同 。
- 1 <= startValue, destValue <= n
- startValue != destValue
解题思路:
- 第一步:先根据上一道题最近公共祖先找到根节点
- 第二步:从根节点往下找到 startValue ,参数携带path路径字符串 每走一步加一个U
- 第二步:从根节点往下找到 destValue , 参数携带path路径字符串 每左走一步加一个L;每右走一步加一个R
- 最后返回res;
我的答案:
/**
* @param {TreeNode} root
* @param {number} startValue
* @param {number} destValue
* @return {string}
*/
var getDirections = function(root, startValue, destValue) {
//根据上一题最近公共祖先题解找到最近根节点
function getRoot(node, startValue,destValue) {
if(!node || node.val===startValue || node.val===destValue) return node;
const left = getRoot(node.left,startValue,destValue);
const right = getRoot(node.right,startValue,destValue);
if(!left) return right;
if(!right) return left;
return node;
}
let node = getRoot(root,startValue,destValue);
let res = ''
// 从根节点往下找到 startValue ,参数携带path路径字符串 每走一步加一个U
function dfs1(node,startValue,path){
if(!node) return;
if(node.val === startValue) { //当找到startValue往res加path
res += path;
return;
}
dfs1(node.left, startValue, path+'U');
dfs1(node.right, startValue, path+'U');
}
dfs1(node,startValue,'')
//从根节点往下找到 destValue , 参数携带path路径字符串 每左走一步加一个L;每右走一步加一个R
function dfs2(node,destValue,path){
if(!node) return;
if(node.val === destValue) { //当找到destValue往res加path
res += path;
return;
}
dfs2(node.left, destValue, path+'L');
dfs2(node.right, destValue, path+'R');
}
dfs2(node,destValue,'')
return res;
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )