【算法21天:Day21】第六章二叉树 LeetCode 二叉树的最近公共祖先(236)

56 阅读1分钟

第三题:

image.png

解题思路:这题看了不会动手了,看了解析都看了很久,后来看了代码,慢慢懂了,后续遍历的回溯思想。需要多想想呀。

var lowestCommonAncestor = function(root, p, q) {
    // 使用递归的方法
    // 需要从下到上,所以使用后序遍历
    // 1. 确定递归的函数
    const traversal = function(root, p, q) {
        // 2. 确定递归终止条件
        if (root === null) return null
        if (root === p || root === q) return root

        // 3. 确定递归单层逻辑
        let left = traversal(root.left, p, q) 
        let right = traversal(root.right, p, q)

        if (left === null && right === null) { // 左右子树都没有找到pq
            return null
        } else if (left === null && right !== null) { // 左子树没找到pq,右子树找到pq
            return right
        } else if (left !== null && right === null) { // 左子树找到pq,右子树没找到pq
            return left
        } else { // 左子树和右子树分别找到p或者q
            return root 
        }
    }
    return traversal(root, p, q)
};