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

简介: 每日三题-验证二叉搜索树、二叉树的直径、把二叉搜索树转换为累加树验证二叉搜索树验证二叉搜索树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月前
|
存储 算法 程序员
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
【数据结构-二叉树 八】【遍历求和】:求根到叶子节点数字之和
93 0
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
57 0
|
7月前
|
Java C++ Python
leetcode-538:把二叉搜索树转换为累加树
leetcode-538:把二叉搜索树转换为累加树
37 0
33_把二叉搜索树转换为累加树
33_把二叉搜索树转换为累加树
|
2月前
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
【数据结构】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树
78 0
|
6月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
61 0
|
7月前
|
人工智能 算法 BI
【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目
【深度优先搜索 图论 树】2872. 可以被 K 整除连通块的最大数目
|
算法 Java
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
代码随想录训练营day23| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树...
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
|
机器学习/深度学习
每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树
每日三题 对称二叉树 从前序与中序遍历序列构造二叉树 不同的二叉搜索树
99 4
每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树
下一篇
DataWorks