每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树

简介: 每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树验证二叉搜索树验证二叉搜索树v

验证二叉搜索树


889bd45b78f94786a2a33c68ef620815.png

解法一

递归

每次判断cur是否在left与right之间

class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE); 
    }
    public boolean isValidBST(TreeNode root,long left,long right){
        if(root == null) return true;
        if(root.val <= left || root.val >= right) return false;
        return isValidBST(root.left,left,root.val)&&isValidBST(root.right,root.val,right);
    }
}

解法二

中序遍历

因为中序遍历二叉搜索树是递增的

记录下前一个节点与当前节点的值比较

class Solution {
    TreeNode pre = null;
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        if(!isValidBST(root.left)){
            return false;
        }
        if(pre != null && pre.val >= root.val){
            return false;
        }
        pre = root;
        return isValidBST(root.right);
    }
}


二叉树的直径


4d3539dd5cff4f5b96d4c2ead0dca295.png

解法一

递归

与求二叉树深度类似

getMax返回的是左右子树的最大深度

所有边就等于left-1+right-1+2 = left+right

class Solution {
    int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        getMax(root);
        return res;
    }
    public int getMax(TreeNode root){
        if(root == null) return 0;
        int left = getMax(root.left);
        int right = getMax(root.right);
        int len = left+right;
        res = Math.max(len,res);
        return 1+Math.max(left,right);
    }
}


把二叉搜索树转换为累加树


88322f143a574fb2974907c933c8998b.png

88322f143a574fb2974907c933c8998b.png

解法一

暴力

先计算出中序遍历结果

在循环遍历加上以前的和

class Solution {
    public TreeNode convertBST(TreeNode root) {
        List<TreeNode> list = new ArrayList<>();
        pre(root,list);
        int size = list.size();
        if(size == 0 || size == 1) return root;
        int curSum = 0;
        for(int i = size-1;i >= 0;i--){
            TreeNode node = list.get(i);
            curSum = node.val+curSum;
            node.val = curSum;
        }
        return root;
    }
    public void pre(TreeNode root,List<TreeNode> list){
        if(root == null) return;
        pre(root.left,list);
        list.add(root);
        pre(root.right,list);
    }
}

解法二

直接中序遍历

但是不是左中右,而是右中左

class Solution {
    int cur = 0;
    public TreeNode convertBST(TreeNode root) {
        if(root == null) return null;
        convertBST(root.right);
        cur = root.val+cur;
        root.val = cur;
        convertBST(root.left);
        return root;
    }
}



相关文章
|
网络协议 Windows
批处理脚本bat设置IP地址
本文目录 1. 前言 2. 方法
790 0
|
弹性计算 安全 关系型数据库
使用ECS手动部署MySQL数据库
领取免费云服务器ECS试用资源,快速部署MySQL数据库。
475 1
|
网络协议 安全 Linux
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
如何修复 SSH Client_loop: send disconnect: Broken pipe Error
4680 1
|
机器学习/深度学习 达摩院 自然语言处理
ICASSP2023|达摩院语音实验室入选论文全况速览
近日,语音技术领域国际会议ICASSP公布了本届论文审稿结果,阿里巴巴达摩院语音实验室有14篇论文被大会收录。本次被接收的论文研究方向涵盖语音识别、语音唤醒、语音增强、说话人日志、语义理解、多模态预训练等。 ICASSP (International Conference on Acoustics, Speech, and Signal Processing) 是国际声学,语音和信号处理会议,是IEEE信号处理协会组织的年度旗舰会议。历届的ICASSP会议都备受全球信号处理领域研究学者的广泛关注,ICASSP2023将于6月4号至6月10号于希腊举办。
946 0
|
安全 前端开发 PHP
医院不良事件上报系统源码 ,通过鱼骨图方法进行原因溯源
技术架构:前后端分离,仓储模式 开发语言:PHP 开发工具:vscode 前端框架:vue2+element 后端框架:laravel8 数 据 库:mysql5.7 填报内容可量化、原因分析可量化,报告内容丰富,报告要素齐全,预设项详尽
532 0
|
JavaScript 前端开发 API
vue3 源码学习,实现一个 mini-vue(十一):组件的设计原理与渲染方案
在实现了 `ELEMENT`、`COMMENT`、`TEXT` 节点的挂载后,我们最后再来实现一下组件的挂载与更新
vue3 源码学习,实现一个 mini-vue(十一):组件的设计原理与渲染方案
|
C#
WPF窗体隐藏鼠标光标的方法
原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.
1895 0
|
Java 数据格式 XML
EMF介绍系列(四、枚举类型、自定义类型和Map)
除了普通的类(接口)以外,在类图里可以定义一些特殊的元素,比较常见的是枚举类型、自定义类型,它们对于一个完整可用的模型也是必不可 少的,这篇帖子主要介绍EMF里它们的使用方法。另外,由于EMF对Map的支持比较特别,所以在这里也简要介绍一下Map类型的定义方法。
1468 0