530.二叉搜索树的最小绝对差
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
输入:root = [4,2,6,1,3] 输出:1
解题思路:
- 这道题首先要看清题意。考察的是二叉搜索树。其遍历顺序是左中右的顺序。因此,我们只需设置标记,及标记节点为上个不为空的节点。当前节点与标记节点进行值对比,取小的值即可。对比完后,当前节点将指向下一节点,这是我们将当前节点设为标记节点即可。
递归解法:
public class Solution {
int min;
TreeNode pre;
public int GetMinimumDifference(TreeNode root) {
if(root == null) return min;
min = int.MaxValue;
GetAbs(root);
return min;
}
public void GetAbs(TreeNode root){
if(root == null)return;
GetAbs(root.left);
if(pre != null){
min = (int)MathF.Min(min,root.val-pre.val);
}
pre = root;
GetAbs(root.right);
}
}
501.二叉搜索树中的众数
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
解题思路:
- 使用中序遍历。同时设置多个标签。maxCount用来记录出现最多次数。count用来记录同一个数重复出现的值。pre表示前一个节点。
- 当出现的节点参数不等于前一个节点参数与pre为null时,我们认为当前节点的参数为新参数,设置其count为1,并且在随后过程中每次遇到都自增。并且每次都将该数与maxCount进行对比。只要存在比maxCount大的时刻,我们就对列表清空,把当前的参数加入到列表中,保证了众数最大的情况。当出现与maxCount相等但参数不同的情况,我们不情况列表,而是把其也加入进来。
解法:
public class Solution {
List<int> resList;
int maxCount;
int count;
TreeNode pre = null;
public int[] FindMode(TreeNode root) {
resList = new List<int>();
maxCount = 0;
count = 0;
findMode1(root);
int[] res = new int[resList.Count];
for (int i = 0; i < resList.Count; i++) {
res[i] = resList[i];
}
return res;
}
public void findMode1(TreeNode root) {
if (root == null) {
return;
}
findMode1(root.left);
int rootValue = root.val;
// 计数
if (pre == null || rootValue != pre.val) {
count = 1;
} else {
count++;
}
// 更新结果以及maxCount
if (count > maxCount) {
resList.Clear();
resList.Add(rootValue);
maxCount = count;
} else if (count == maxCount) {
resList.Add(rootValue);
}
pre = root;
findMode1(root.right);
}
}
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点5
和节点1
的最近公共祖先是节点3 。
解法:
public class Solution {
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p ||root == q){
return root;
}
TreeNode left = LowestCommonAncestor(root.left,p,q);
TreeNode right = LowestCommonAncestor(root.right,p,q);
if(left == null && right == null) { // 若未找到节点 p 或 q
return null;
}else if(left == null && right != null) { // 若找到一个节点
return right;
}else if(left != null && right == null) { // 若找到一个节点
return left;
}else { // 若找到两个节点
return root;
}
}
}