博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----98. Validate Binary Search Tree
阅读量:4112 次
发布时间:2019-05-25

本文共 2247 字,大约阅读时间需要 7 分钟。

链接:

大意:

给定一棵二叉树,判断该二叉树是否为BST(搜索二叉树)

思路:

对二叉树进行中序遍历,得到中序遍历序列。如果中序遍历序列是严格递增,则二叉树BST。

代码:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isValidBST(TreeNode root) {        if (root == null)            return true;        List
list = new ArrayList<>(); inOrder(root, list); Integer[] array = new Integer[list.size()]; list.toArray(array); int i = 1; while (i < array.length) { if (array[i] <= array[i - 1]) break; i++; } return i == array.length; } // 获取中序遍历序列 如果中序遍历序列为递增序列 则为BST public void inOrder(TreeNode root, List
list) { if (root == null) return ; inOrder(root.left, list); list.add(root.val); inOrder(root.right, list); }}

结果:

结论:

效率比较低的原因是其空间复杂度为O(n),另外还有就是判断是否有序时需要遍历整个序列。 

之后尝试了对代码进行改进,发现可以不使用list存储变量,这样空间复杂度便降下来了。

改进:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    int pre = Integer.MIN_VALUE;    boolean t = true, start = false; // start用于判断当前节点是否为中序变量的第一个节点 t用于判断是否有序    public boolean isValidBST(TreeNode root) {        if (root == null)            return true;        inOrder(root);        return t;    }    // 获取中序遍历序列  如果中序遍历序列为递增序列 则为BST    public void inOrder(TreeNode root) {        if (root == null)            return ;        inOrder(root.left);        if (!start) {            pre = root.val;            start = true;        } else {            t = t && root.val > pre;            pre = root.val;           }        inOrder(root.right);    }}

 

最佳:(递归实现)

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

 

 

转载地址:http://ltesi.baihongyu.com/

你可能感兴趣的文章
vim 小技巧------写程序注释
查看>>
Java基础语法
查看>>
Java面向对象
查看>>
Java泛型
查看>>
Java注解
查看>>
Java_IO流
查看>>
mysql笔记
查看>>
JDBC笔记
查看>>
Mybatis复习_1
查看>>
mybatis_maven_坐标
查看>>
Mybatis核心配置文件
查看>>
java.io.IOException: Could not find resource mybatis-config.xml
查看>>
xxxMapper.xml
查看>>
mybatis_properties
查看>>
idea debug 首先进入 URlLClassLoader 解决办法
查看>>
冒泡排序
查看>>
存储过程怎么使用
查看>>
Java实习生面试题与笔试题
查看>>
Docker+Kubernetes(K8s)企业级架构师实战视频教程-2021最新
查看>>
centos7.7安装部署docker
查看>>