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


    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 搜索即可~


  • 相关阅读:
    电脑删除的视频怎么恢复?可尝试着3钟恢复办法!
    Bootstrap前端开发框架(简介、版本、优点、使用、布局容器、栅格系统(栅格选项参数,列嵌套,列偏移,列排序,响应式工具))
    vue预览下载PDF文件
    PHP:三元运算符
    如何查看自己的公网IP?
    选择器进阶与表单表格
    怎么提高自己的系统架构水平
    穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益(2023.11)
    cocos creator 3.6 发布web手机端 加载进度条添加
    安全篇 | 21 | 安全基础理论
  • 原文地址:https://blog.csdn.net/xjh093/article/details/126134545