先放在这里明天在补上,因为明天休息,昨天的今天都补完了。
我在参与代码训练营之前是有自学一段时间,因为自学过,还可以吃老本,现在老本都吃完了,不努力不行了呀,天天都要进步呀!
开启补课之旅了,训练营的课程安排很人性化呀,知道我们上班族周末要休息一天,就特地安排休息,太好了,让我有时间跟上大部队的步伐。
一、二叉搜索树的最小绝对差
leetcode题目链接:530. 二叉搜索树的最小绝对差
题目描述:
给你一个二叉搜索树的根节点
root
,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。
再次强调一下二叉搜索树的特性,二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 它的左、右子树也分别为二叉搜索树。
这三个特性一定要牢记。
来看一下JS代码:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
// 采用中序遍历的方式,左、中、右,这样子遍历出来的二叉搜索树是一个单调递增的序列
var getMinimumDifference = function(root) {
let result = Number.MAX_SAFE_INTEGER;
let pre = null;
const traversal = (cur) => {
if (cur == null) {
return;
}
traversal(cur.left)
if (pre != null) {
const num = Math.abs(cur.val - pre.val)
result = Math.min(num, result);
}
pre = cur;
traversal(cur.right)
}
traversal(root)
return result;
};
二、二叉搜索树中的众数
leetcode题目链接:501. 二叉搜索树中的众数
题目描述:
给你一个含重复值的二叉搜索树(BST)的根节点
root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。
采用中序遍历的方式,递归遍历一遍就把问题给解决了,来看一下JS代码:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
// 采用双指针法,遍历一遍就把问题解决了
// 采用中序遍历的方式,左、中、右,
var findMode = function(root) {
let pre = null;
let result = [];
let maxCount = 1;
let count = 0;
const traversal = (cur) => {
if (cur == null) {
return;
}
traversal(cur.left);
// 统计单一元素出现频率
if (pre?.val == cur.val) {
count++;
} else {
count = 1;
};
pre = cur;
if (count == maxCount) {
result.push(cur.val);
}
if (count > maxCount) {
result = [];
maxCount = count;
result.push(cur.val);
}
traversal(cur.right);
}
traversal(root);
return result;
};
三、二叉树的最近公共祖先
leetcode题目链接:236. 二叉树的最近公共祖先
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
var lowestCommonAncestor = function(root, p, q) {
// 使用递归的方法
// 需要从下到上,所以使用后序遍历
// 1. 确定递归的函数
const travelTree = function(root,p,q) {
// 2. 确定递归终止条件
if(root === null || root === p || root === q) {
return root;
}
// 3. 确定递归单层逻辑
let left = travelTree(root.left,p,q);
let right = travelTree(root.right,p,q);
if(left !== null && right !== null) {
return root;
}
if(left === null) {
return right;
}
return left;
}
return travelTree(root,p,q);
};