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

简介: 每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树验证二叉搜索树验证二叉搜索树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;
    }
}



相关文章
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
45 0
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
55 0
|
6月前
|
Java C++ Python
leetcode-538:把二叉搜索树转换为累加树
leetcode-538:把二叉搜索树转换为累加树
36 0
33_把二叉搜索树转换为累加树
33_把二叉搜索树转换为累加树
|
1月前
二叉树的深度、路径总和、将有序数组转换为二叉搜索树、二叉搜索树迭代器(2022/02/23)
二叉树的深度、路径总和、将有序数组转换为二叉搜索树、二叉搜索树迭代器(2022/02/23)
12 0
|
1月前
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
35 0
|
5月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
48 0
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
53 0
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
|
算法 Java
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...