530. 二叉搜索树的最小绝对差
这个题目递归法比迭代法简洁很多
注意:自己写的时候出现的问题!
二叉搜索树的左右子节点并不直接满足与当前节点比较即可得出最小差值。二叉搜索树的中序遍历结果是有序的,因此相邻节点之间的差值才是最小的。我的代码只是比较了当前节点的左右孩子,而没有全局考虑所有节点的相邻关系。
重点:学会在递归遍历的过程中如何记录前后两个指针。
递归法
中序遍历
class Solution {
private int result = Integer.MAX_VALUE;
private TreeNode prev = null; // 记录上一个遍历的结点
public int getMinimumDifference(TreeNode root) {
// 递归法
if (root == null) return 0;
// 进行中序遍历
inorderTraversal(root);
return result;
}
private void inorderTraversal(TreeNode node) {
if (node == null) return;
inorderTraversal(node.left); // 左
if (prev != null)
result = Math.min(result, node.val - prev.val); // 中
prev = node;
inorderTraversal(node.right); // 右
}
}
迭代法
统一迭代法-中序遍历
这个方法跟98大差不差。
class Solution {
public int getMinimumDifference(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
int result = Integer.MAX_VALUE;
if(root != null)
stack.add(root);
while(!stack.isEmpty()){
TreeNode curr = stack.peek();
if(curr != null){
stack.pop();
if(curr.right != null)
stack.add(curr.right);
stack.add(curr);
stack.add(null);
if(curr.left != null)
stack.add(curr.left);
}else{
stack.pop();
TreeNode temp = stack.pop();
if(pre != null)
result = Math.min(result, temp.val - pre.val);
pre = temp;
}
}
return result;
}
}
501. 二叉搜索树中的众数
236. 二叉树的最近公共祖先
休息一下,剩下两道晚上补