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


    0x00 题目

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

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

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


    0x01 思路

    因为有 2 个目标
    所以有 2 条路径
    先把 2 条路径找出来
    然后再找出最近的公共祖先
    最后再拼接路径


    0x02 解法

    语言:Swift

    树节点:TreeNode

    public class TreeNode {
        public var val: Int
        public var left: TreeNode?
        public var right: TreeNode?
        public init() { self.val = 0; self.left = nil; self.right = nil; }
        public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
        public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
            self.val = val
            self.left = left
            self.right = right
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    解法:

    func getDirections(_ root: TreeNode?, _ startValue: Int, _ destValue: Int) -> String {
        guard let root = root else { return "" }
        // 第一条路径
        var path1: [(TreeNode, String)] = []
        // 第二条路径
        var path2: [(TreeNode, String)] = []
        // 结果 
        var res = ""
        // 节点和方向
        var arr: [(TreeNode, String)] = []
        
        func dfs(_ root: TreeNode?, _ val: Int, _ type: String) {
            guard let root = root else { return }
            
            // 添加
            arr.append((root, type))
            if root.val == val {
                if val == startValue {
                    path1 = Array(arr)
                }else if val == destValue {
                    path2 = Array(arr)
                }
                return
            }
            
            dfs(root.left, val, "L")
            dfs(root.right, val, "R")
            // 往回走了,删除最后一个
            arr.removeLast()
        }
        
        // 查找第一条路径
        dfs(root, startValue, "")
        arr.removeAll()
        // 查找第二条路径
        dfs(root, destValue, "")
    
        var idx1 = 0
        var idx2 = 0
        let idx = min(path1.count, path2.count)
        
        // 去掉路径中相同的前缀
        while idx1 < idx && idx2 < idx {
            let t1 = path1[idx1]
            let t2 = path2[idx2]
            
            if t1.0.val == t2.0.val {
                idx1 += 1
                idx2 += 1
            }else{
                break
            }
        }
        
        // 第一条路径是从下往上走,所以把方向全部调整为 `U`
        for _ in idx1..
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    0x03 我的小作品

    欢迎体验我的作品之一:小五笔 86 版
    五笔学习好帮手~
    App Store 搜索即可~


  • 相关阅读:
    磁盘空间不够引发的控制录像程序崩溃到后端的解决方式
    猿创征文|date-fns 小时助手函数
    GO 比较两个对象是否相同
    SpringMVC【框架】
    几类单波束和多波束声呐的区别
    接口测试必备知识点(含实战项目)
    建模杂谈系列173 密级与交付
    入行数字IC验证的一些建议
    HD钱包(身份钱包)简介
    GLM-4-9B 支持 Ollama 部署
  • 原文地址:https://blog.csdn.net/xjh093/article/details/126134545