精品推荐:
自从上次问9.9和9.11哪个大,Kimi翻车之后,发现Chatgpt也跟着翻车,不过它们的回答结果每次都不一样,有时候是对的有时候是错的。后来我让它们用更劲爆的语气在回答下,结果它们开始怼我了。。。
下面是腾讯元宝的回复:
下面是Chatgpt的回复:
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第530题:二叉搜索树的最小绝对差。
问题描述
来源:LeetCode第530题
难度:简单
给你一个二叉搜索树的根节点 root ,返回树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。
示例1:
输入:root = [4,2,6,1,3]
输出:1
示例2:
输入:root = [1,0,48,null,null,12,49]
输出:1
树中节点的数目范围是 [2, 10^4]
0 <= Node.val <= 10^5
问题分析
这题让计算二叉搜索树中任意两个节点的最小差值,如果我们把二叉搜索树中所有的节点值都保存下来,然后对这些值进行排序,排序之后只需要前后两两比较,即可找出最小的差值。
但是二叉搜索树有一个重要的特性我们不要忘了,就是它的中序遍历结果一定是有序的,我们只需要对这棵二叉搜索树进行中序遍历,遍历的时候和前一个节点比较,保存差值的最小值即可。
JAVA:
int ans = Integer.MAX_VALUE;// 差值的最小值
TreeNode pre;// 前一个节点
public int getMinimumDifference(TreeNode root) {
inorder(root);
return ans;
}
// 二叉树的中序遍历
public void inorder(TreeNode root) {
if (root == null)
return;
inorder(root.left);// 递归左子树
// 和前一个节点比较,保存最小的差值
if (pre != null)
ans = Math.min(ans, root.val - pre.val);
pre = root;
inorder(root.right);// 递归右子树
}
C++:
public:
int ans = INT_MAX;// 差值的最小值
TreeNode *pre;// 前一个节点
int getMinimumDifference(TreeNode *root) {
inorder(root);
return ans;
}
// 二叉树的中序遍历
void inorder(TreeNode *root) {
if (root == nullptr)
return;
inorder(root->left);// 递归左子树
// 和前一个节点比较,保存最小的差值
if (pre)
ans = min(ans, root->val - pre->val);
pre = root;
inorder(root->right);// 递归右子树
}
Python:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
ans = sys.maxsize # 差值的最小值
pre = None # 前一个节点
# 二叉树的中序遍历
def inorder(node):
nonlocal ans, pre
if not node:
return
inorder(node.left) # 递归左子树
# 和前一个节点比较,保存最小的差值
if pre:
ans = min(ans, node.val - pre.val)
pre = node
inorder(node.right) # 递归右子树
inorder(root)
return ans
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。