日常刷题0x12之未出新手村

103 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号:236
//递归就是处理相同子问题
//lowestCommonAncestor返回找到的匹配上的节点
//递归往下执行,回朔往上,往上那么我就要把一些信息
//给带上去好让上面的人知道,然后利用我这些信息处理
//问题

//下面的这种解法基于该二叉树肯定右符合题意的p,q
//那么就一定能找到p,q,找到就往上传递
//传递的的信息总能汇聚到一个节点处理逻辑下
var lowestCommonAncestor = function (root, p, q) {
    if (root == null) {
        return null
    }
    if (root == p || root == q) {
        return root
    }
    //递归主逻辑
    //找左子树匹配上的节点
    let left = lowestCommonAncestor(root.left, p, q)
    //找右子树匹配上的节点
    let right = lowestCommonAncestor(root.right, p, q)
    if (left == null && right == null) {
        //左边子树没找到匹配的节点,右边也没找到
        //返回null标识该子树没有匹配到的节点
        return null
    }
    if (left == null) {
        //右子树找到了,左没找到
        //返回右
        return right
    }
    if (right == null) {
        //左子树找到了,右没找到
        //返回左
        return left
    }
    //左,右都找到了,弹出左右的根
    return root
};
题号:230
//谁都能想到的遍历找值的方法:中序遍历
//优先不予以考虑此种解法
var kthSmallest = function (root, k) {
    let result = []
    let helper = (node) => {
        if (node == null) {
            return
        }
        helper(node.left)
        result.push(node.val)
        helper(node.right)
    }
    helper(root)
    return result[k - 1]
};

//迭代栈
var kthSmallest = function (root, k) {
    let stack = []
    while (true) {
        //一直走到左的尽头
        while (root != null) {
            stack.push(root)
            root = root.left
        }
        let node = stack.pop()
        k--
        if (k == 0) {
            return node.val
        }
        root = node.right
    }
};