530.二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
function getMinimumDifference(root: TreeNode | null): number {
let minDiff = Infinity;
let preVal: number | undefined;
function traverse(root: TreeNode | null){
if(!root) return null;
traverse(root.left);
if(preVal === undefined) preVal = root.val;
else{
if(root.val - preVal < minDiff){
minDiff = root.val - preVal;
}
preVal = root.val;
}
traverse(root.right)
}
traverse(root);
return minDiff;
};
501.二叉搜索树中的众数
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
提示:如果众数超过1个,不需考虑输出顺序
function findMode(root: TreeNode | null): number[] {
let maxFreq = 0;
let maxResults = [];
let tmpFreq = 0;
let preVal: number | undefined;
function inorderTraverse(root: TreeNode | null) {
if (!root) return;
inorderTraverse(root.left);
if (preVal !== root.val) tmpFreq = 1;
else tmpFreq++;
preVal = root.val;
if (maxFreq < tmpFreq) {
maxFreq = tmpFreq;
maxResults = [root.val];
} else if (maxFreq === tmpFreq) {
maxResults.push(root.val);
}
inorderTraverse(root.right);
}
inorderTraverse(root);
return maxResults;
};
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null {
let result: TreeNode | undefined;
function traverse(root: TreeNode | null){
if(!root) return false;
let isLeft = traverse(root.left);
let isRight = traverse(root.right);
let isSelf = root.val === p.val || root.val === q.val;
if((isSelf && (isRight || isLeft )) || (isRight && isLeft)){
if(result === undefined) result = root;
}
return isSelf || isLeft || isRight;
}
traverse(root)
return result;
};
官方题解:
function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null {
if (root === null || root === p || root === q) return root;
const left = lowestCommonAncestor(root.left, p, q);
const right = lowestCommonAncestor(root.right, p, q);
if (left !== null && right !== null) return root;
if (left !== null) return left;
if (right !== null) return right;
return null;
};