代码随想录算法训练营第21天 530. 二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

530. 二叉搜索树的最小绝对差

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Integer prev,min; // prev 用于保存上一个遍历到节点的值 min用于保存目前找到的最小差值
    public int getMinimumDifference(TreeNode root) {
        prev = null;  // 初始时 还没有遍历过任何节点
        min = Integer.MAX_VALUE; // 初始时, 最小差值设为最大整数
        inorder(root); // 中序遍历二叉搜索树
        return min;  // 返回最小差值
    }

    private void inorder(TreeNode root){
        if(root == null){
            // 如果当前节点为空 直接返回
            return;
        }

        inorder(root.left); // 先遍历左子树
        if(prev != null){
            // 如果已经遍历过至少一个节点
            min = Math.min(min,root.val -prev); // 更新最小差值
        }
        prev = root.val;  // 将当前节点的值保存到 prev中
        inorder (root.right);
    }
}

 501.二叉搜索树中的众数

import java.util.*;

class Solution {
    public int[] findMode(TreeNode root) {
        List mode = new ArrayList<>();
        TreeNode cur = root;
        TreeNode pre = null;
        
        int maxCount = 0, count = 1;
        Stack stack = new Stack<>();
        
        // 使用栈实现中序遍历
        while(cur != null || !stack.isEmpty()){
            // 将所有左子节点压入栈中
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            // 处理栈顶节点
            cur = stack.pop();
            if(pre != null){
                if(pre.val == cur.val){
                    count++;
                }else{
                    count = 1;
                }
            }
            if(count >= maxCount){
                if(count > maxCount){
                    maxCount = count;
                    mode.clear();
                }
                mode.add(cur.val);
            }
            pre = cur;
            cur = cur.right;
        }
        
        // 转换为数组输出
        int[] res = new int[mode.size()];
        for(int i = 0; i < mode.size(); i++){
            res[i] = mode.get(i);
        }
        return res;
    }
}

你可能感兴趣的:(代码随想录算法训练营,算法,java,数据结构)