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

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



相关文章
|
7月前
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
代码随想录Day19 LeetCode T669修剪二叉搜索树 LeetCode T108将有序数组转化为二叉搜索树 T538 把二叉搜索树转化为累加树
35 0
|
7月前
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
29 0
|
3天前
|
Java C++ Python
leetcode-538:把二叉搜索树转换为累加树
leetcode-538:把二叉搜索树转换为累加树
22 0
|
7月前
代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数
代码随想录 Day13 二叉树 LeetCode T104 二叉树的最大深度 T111 二叉树的最小深度 T222完全二叉树的节点个数
35 0
|
6月前
|
算法
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
代码随想录算法训练营第二十二天 | LeetCode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树
32 0
|
9月前
|
存储 算法
算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
|
9月前
|
算法
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
算法训练Day21|530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
|
11月前
|
算法 Java
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
|
11月前
|
机器学习/深度学习 存储 人工智能
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
代码随想录训练营day21| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先...
LeetCode 538. 把二叉搜索树转换为累加树
LeetCode 538. 把二叉搜索树转换为累加树
136 0
LeetCode 538. 把二叉搜索树转换为累加树