代码随想录算法训练营day20

530_二叉搜索树的最小绝对差(看题解了)

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

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

提示:树中至少有 2 个节点。

算法思想:

1、二叉排序树,中序遍历后是一个递增有序数组,可以转化为数组之后操作。

2、中序遍历,设置一个全局变量指向当前节点的前驱节点,求差值。

代码:

class Solution {
    int ans = 100000;
    TreeNode pre = null;

    public void inorder(TreeNode root) {
        if (root == null)
            return;
        inorder(root.left);
        if (pre != null) {
            int temp = Math.abs(pre.val - root.val);
            if (temp < ans)
                ans = temp;
        }
        pre = root;
        inorder(root.right);
    }

    public int getMinimumDifference(TreeNode root) {
        /*
         * 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
         * 
         * 差值是一个正数,其数值等于两值之差的绝对值。
         */

        inorder(root);
        return ans;
    }
}

注意:

学会在递归中如何记录前一个节点。

题目:501_二叉搜索树中的众数(看了题解)

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

例如:

给定 BST [1,null,2,2],

501. 二叉搜索树中的众数

返回[2].

提示:如果众数超过1个,不需考虑输出顺序

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

#

算法思想:

注意利用线索二叉树的特性。

重复的数据是连续访问到的。因此只用定义一个变量 count,记录当前元素出现的次数。

如果当前元素为第一个元素,或者,当前元素不等于前驱节点,count 值置为1;

否则,即 当前节点等于前驱节点,count ++;

再依据当前节点的 count 值,判断是否更新众数。

如果当前 count== maxcount,

如果当前count > maxcount ,则需要更新所有众数,之前获得的众数被取代。清空 list,将当前节点加入 list,更新;

最后,手动把 ArrayList 转为 int[] ;

代码:

import javax.imageio.stream.ImageInputStream;
import java.util.ArrayList;

public class Solution2 {

    TreeNode pre = null;
    int count = 0, maxcount = 1;
    ArrayList<Integer> ans = new ArrayList<Integer>();

    public void inorder(TreeNode root) {
        if (root == null) return;
        inorder(root.left);
        //更新 count 值
        if (pre == null||root.val!=pre.val) count = 1;
        else count++;
        //找出众数
        if(count>maxcount){
            ans.clear();;
            ans.add(root.val);
            maxcount=count;
        }else if(count==maxcount){
            ans.add(root.val);
        }
        pre = root; //更新前驱指针
        inorder(root.right);


    }


    public int[] findMode(TreeNode root) {

        inorder(root);
        int list[] = new int[ans.size()];     //把 ArrayList 手动转数组
        for (int i = 0; i < ans.size(); i++) {
            list[i] = ans.get(i);
        }
        return list;

    }

    public static void main(String[] args) {


        TreeNode t1 = new TreeNode(1,null,null);
        int [] ans = new Solution2().findMode(t1);
        for (int i = 0; i < ans.length; i++) {
            System.out.println(ans[i]);

        }
    }
}

算法思想:

题目:236_二叉树的最近公共祖先(看了题解)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

算法思想:

题目规定给定结点不同且一定有公共祖先结点。

采用计算型后序递归,递归终止条件1、结点为空,返回空;2、节点为p或q,返回p、或q。

退出时处理当前节点,若当前节点1、左子树和右子树返回值都不为空,返回当前节点;2、左子树不空返回左子树;3、右子树不用返回右子树。

代码:

public class Solution {
    //算法思想,后序遍历,遇到p、q 将结点返回,如果当前节点左右子树返回值都不为空,表示当前节点是pq公共祖先。
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(root ==p||root==q) return root; //第一次访问节点,判断该节点是不是p、q若是则递归终止,返回结点
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left!=null&&right!=null) return root;  //退出该结点前判断该点是否左右子树都有返回值,若是,则该结点为公共父节点,返回
        else if(left!=null&&right==null) return left;
        else if(left==null&&right!=null) return right;
        else return null;
    }
}

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值