代码随想录算法营DAY21 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
530.二叉搜索树的最小绝对差
思路:
还是先转为有序数组再去求
代码:
var getMinimumDifference = function (root) {
const nums = [];
function inorder(node) {
if (node === null) return;
inorder(node.left);
nums.push(node.val);
inorder(node.right);
};
inorder(root);
let min =nums[1]-nums[0];
for (let i = 2; i < nums.length; i++) {
let a = nums[i] - nums[i-1];
min=a<min?a:min;
}
return min;
};
501.二叉搜索树中的众数
思路:
用一个pre节点记录前一个节点方便比较。中序遍历的时候,比较出现次数。如果大于maxcount则清空数组放入新值,如果等于就直接加入,如果小于就不做处理。
代码:
var findMode = function (root) {
// 不使用额外空间,使用中序遍历,设置出现最大次数初始值为1
let count = 0, maxCount = 1;
let pre = null, res = [];//初始化pre为null,这样确定pre为null的时候就是比较的第一个元素
// 1.确定递归函数及函数参数
const travelTree = function (cur) {
// 2. 确定递归终止条件
if (cur === null) {
return;
}
travelTree(cur.left);
// 3. 单层递归逻辑
if(pre===null) count=1;
else if (pre.val === cur.val) {
count++;
} else {
count = 1;
}
pre = cur;
if (count === maxCount) {
res.push(cur.val);
}
if (count > maxCount) {
res = [];
maxCount = count;
res.push(cur.val);
}
travelTree(cur.right);
}
travelTree(root);
return res;
};
501.二叉搜索树中的最近公共祖先
思路:
用后序遍历回溯的思想解决
1.确定参数和返回值
2.确定终止条件:
当节点为空时返回空,当节点等于要查找的节点时返回节点
3.单层递归逻辑:
先递归遍历左右子树,分类讨论
(1)如果左右子树都不为空,则返回节点本身
(2)如果左为空返回右(右同理)
(3)如果左右都为空返回空
代码:
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&&right) return root;
else if(!left) return right;
else if(!right) return left;
else return null;
};
感想总结
二叉搜索树多用中序遍历去处理,这样相当于有序数组。
涉及到从底向上遍历的题目最好用后序遍历去回溯。