LeetCode Everyday - 从二叉树一个节点到另一个节点每一步的方向

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

从二叉树一个节点到另一个节点每一步的方向

给你一棵 二叉树 的根节点 root ,这棵二叉树总共有 n 个节点。每个节点的值为 1 到 n 中的一个整数,且互不相同。给你一个整数 startValue ,表示起点节点 s 的值,和另一个不同的整数 destValue ,表示终点节点 t 的值。

请找到从节点 s 到节点 t 的 最短路径 ,并以字符串的形式返回每一步的方向。每一步用 大写 字母 'L' ,'R' 和 'U' 分别表示一种方向:

'L' 表示从一个节点前往它的 左孩子 节点。 'R' 表示从一个节点前往它的 右孩子 节点。 'U' 表示从一个节点前往它的 父 节点。 请你返回从 s 到 t 最短路径 每一步的方向。

示例1:

image.png

输入:root = [5,1,2,3,null,6,4], startValue = 3, destValue = 6
输出:"UURL"
解释:最短路径为:31526

示例2:

image.png

输入: root = [2,1], startValue = 2, destValue = 1
输出: "L"
解释: 最短路径为:21

提示:

  • 树中节点数目为 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;
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )