530. 二叉搜索树的最小绝对差
- 原题链接:
- 完成情况:
- 解题思路:
- 参考代码:
- 错误经验吸取
- 在java中,一个类里面的属性,直接定义在类下面和定义在该类的方法里,有什么区别???
原题链接:
530. 二叉搜索树的最小绝对差
https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/
完成情况:
解题思路:
package 代码随想录.树.二叉树;
import 代码随想录.树.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
public class _530二叉搜索树的最小绝对差_迭代 {
TreeNode prevNode; //定义在这里,会有一个默认的空参构造器
/**
*
* @param root
* @return
*/
public int getMinimumDifference(TreeNode root) {
if (root == null){
return 0;
}
Deque<TreeNode> myStack = new ArrayDeque<TreeNode>();
TreeNode curNode = root;
int result = Integer.MAX_VALUE;
while (curNode != null || !myStack.isEmpty()) {
if (curNode != null){
myStack.push(curNode);
curNode = curNode.left;
}else {
curNode = myStack.pop();
if (prevNode != null){
result = Math.min(result,Math.abs(curNode.val - prevNode.val));
}
prevNode = curNode;
curNode = curNode.right;
}
}
return result;
}
}
参考代码:
package 代码随想录.树.二叉树;
import 代码随想录.树.TreeNode;
import java.util.ArrayDeque;
import java.util.Deque;
public class _530二叉搜索树的最小绝对差_迭代 {
TreeNode prevNode; //定义在这里,会有一个默认的空参构造器
/**
*
* @param root
* @return
*/
public int getMinimumDifference(TreeNode root) {
if (root == null){
return 0;
}
Deque<TreeNode> myStack = new ArrayDeque<TreeNode>();
TreeNode curNode = root;
int result = Integer.MAX_VALUE;
while (curNode != null || !myStack.isEmpty()) {
if (curNode != null){
myStack.push(curNode);
curNode = curNode.left;
}else {
curNode = myStack.pop();
if (prevNode != null){
result = Math.min(result,Math.abs(curNode.val - prevNode.val));
}
prevNode = curNode;
curNode = curNode.right;
}
}
return result;
}
}
错误经验吸取
在java中,一个类里面的属性,直接定义在类下面和定义在该类的方法里,有什么区别???
在Java中,类的属性可以直接定义在类的顶层,也可以在类的方法内部定义局部变量。这两者之间有一些关键的区别:
-
作用域:
- 类的顶层属性(成员变量): 这些属性的作用域是整个类,可以被类中的所有方法访问。它们通常用于描述对象的状态或特征。
- 方法内部的局部变量: 这些变量的作用域仅限于包含它们的方法。它们在方法执行时创建,方法执行完毕后就会销毁。局部变量通常用于存储临时数据或方法内的计算结果。
-
生命周期:
- 类的顶层属性: 随着对象的创建而存在,随着对象的销毁而销毁。它们的生命周期与对象的生命周期相同。
- 方法内部的局部变量: 在方法执行期间存在,一旦方法执行完毕,它们就会被销毁。它们的生命周期比成员变量短暂。
-
初始化:
- 类的顶层属性: 如果不显式地初始化,它们将被赋予默认值(如数值类型为0,引用类型为null等)。
- 方法内部的局部变量: 必须显式地初始化,否则编译器会报错。局部变量不会自动初始化为默认值。
-
访问修饰符:
- 类的顶层属性: 可以使用访问修饰符控制其访问权限,例如
private
、protected
、public
等。 - 方法内部的局部变量: 不可使用访问修饰符,因为它们只在包含它们的方法内可见。
- 类的顶层属性: 可以使用访问修饰符控制其访问权限,例如
下面是一个简单的示例,演示了类的顶层属性和方法内部的局部变量:
public class ExampleClass {
// 类的顶层属性(成员变量)
private int memberVariable;
// 类的方法
public void exampleMethod() {
// 方法内部的局部变量
int localVar = 10;
// 访问类的顶层属性
this.memberVariable = 20;
// 访问局部变量
System.out.println("局部变量:" + localVar);
}
}
总的来说,成员变量通常用于描述对象的状态,而局部变量通常用于方法内的临时计算。选择何种形式取决于变量的作用范围和生命周期。