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