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

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

讲解链接:代码随想录-530.二叉搜索树的最小绝对差

二叉搜索树,中序遍历,值是从小到大排列的,所以我们用当前值减去前一个值,就能得到差,然后用全局变量比较和保存差值。

搜索树题目感觉都要使用全局变量,这里我们定义两个,一是前一个节点,二是结果:最小差值。

  1. 确定返回值和参数:可以直接使用模板方法。
  2. 确定终止条件:当节点为空时直接返回我们定义的全局最小值变量。
  3. 确定单层递归逻辑:左遍历完后,首先判断前一个节点是否为空,不为空就求当前节点和前一个节点的差,然后跟全局最小值比较,如果更小就更新;然后把前一个节点指向当前节点,进入下一次遍历。

 

TreeNode preNode = null;
int minDiff = Integer.MAX_VALUE;

public int getMinimumDifference(TreeNode root) {
    if (root == null) {
        return minDiff;
    }
    getMinimumDifference(root.left);
    if (preNode != null) {
        int diff = Math.abs(root.val - preNode.val);
        minDiff = Math.min(diff, minDiff);
    }
    preNode = root;
    getMinimumDifference(root.right);

    return minDiff;
}

501.二叉搜索树中的众数

讲解链接:代码随想录-501.二叉搜索树中的众数

二叉搜索树,优先想到中序遍历,因为使用中序遍历,可以保证值是从小到大递增的。

这道题有难度的是如何维持好每次遍历的结果。这里我们需要4个全局变量,分别是:最大重复数量,最近一次连着的数量,上一个节点,结果集。

在中间写逻辑代码,具体代码看注释。

int maxCount = 0;
int count = 0;
List<Integer> result = new ArrayList<>();
TreeNode preNode = null;

public int[] findMode(TreeNode root) {
    inorderTraversal(root);
    return result.stream().mapToInt(a -> a.intValue()).toArray();
}
public void inorderTraversal(TreeNode root) {
    if (root == null) return;
    /* 左 */
    inorderTraversal(root.left);

    /* 中 */
    // 如果前一个节点为空,或则前一个节点的值不等于当前节点的值,重置Count
    if (preNode == null || preNode.val != root.val) {
        count = 1;
    } else {
        count++;
    }
    // 当前值等于最大值,直接添加
    if (count == maxCount) {
        result.add(root.val);
    } else if (count > maxCount) { // 当前值出现数量大于最大数量,清空集合,然后只添加当前值
        result.clear();
        result.add(root.val);
        maxCount = count;
    }
    preNode = root;

    /* 右 */
    inorderTraversal(root.right);
}

236.二叉树的最近公共祖先

讲解链接:代码随想录-236.二叉树的最近公共祖先

提示:后序遍历

  1. 确定返回值和参数:直接用模板方法就行
  2. 确定递归终止条件:如果当前节点等于需要查找的节点,就直接返回当前节点。
  3. 确定单层递归逻辑:后序遍历,遍历完左子树和右子树,分别用两个变量接收,如果两个变量都不为空,说明当前节点就是公共祖先,可以直接返回了。如果只有一个节点不为空,返回这个不为空的节点。

 

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) return null;
    if (root == p || root == q) {
        return root;
    }

    TreeNode node1 = lowestCommonAncestor(root.left, p, q);
    TreeNode node2 = lowestCommonAncestor(root.right, p, q);
  
    if (node1 != null && node2 != null) return root;
    else if (node1 != null) return node1;
    else if (node2 != null) return node2;

    return null;
}

总结

不知道这两天是状态不好还是基础不扎实,勉强可以想到方式,但是竟然没法实现,实现后很多bug,慢慢修改才通过,通过也是碰运气过的,没太大概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值