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

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

题目要求

Given a binary tree, determine if it is a valid binary search tree (BST).Assume a BST is defined as follows:The left subtree of a node contains only nodes with keys less than the node's key.The right subtree of a node contains only nodes with keys greater than the node's key.Both the left and right subtrees must also be binary search trees.Example 1:    2   / \  1   3Binary tree [2,1,3], return true.Example 2:    1   / \  2   3Binary tree [1,2,3], return false.

检验二叉查找树是否符合规则。二叉查找树是指当前节点左子树上的值均比其小,右子树上的值均比起大。

思路一:stack 深度优先算法

如果了解中序遍历的同学可以知道,一颗二叉查找树的中序遍历结果应当是一个数值有小到大递增的数组。正因为中序遍历是指先遍历左子树,接着遍历中间节点,再遍历右子树,恰好和查找树的值递增顺序相同。因此在这里我们采用栈的方式实现中序遍历,通过研究中序遍历是否递增来判断二叉查找树是否符合规则。代码如下:

public boolean isValidBST(TreeNode root) {        long currentVal = Long.MIN_VALUE;        LinkedList
stack = new LinkedList
(); while(root!=null || !stack.isEmpty()){ while(root!=null){ stack.push(root); root = root.left; } root = stack.pop(); if(root.val<=currentVal) return false; currentVal = root.val; root = root.right; } return true; }

这里需要注意的是,将最小值取为Long.MIN_VALUE,以免出现Integer.MIN_VALUE的误判

思路二:递归 深度优先算法

我们知道,任何一个二叉查找树的节点都有一个取值区间,如果我们能够找到该节点的取值区间以及其左右子节点对应的取值区间,就可以递归的判断该树是否是一颗二叉查找树。为了实现递归,我们需要找到其中的一般情况。假设我们已经知道了当前节点的区间,那么左子节点的上限即为父节点的值,而下限则应该为父节点的下限。同理,右子节点的下限是父节点的值,而上限也就是父节点的上线。

代码如下:

public boolean isValidBST2(TreeNode root){        return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);    }        public boolean isValid(TreeNode treeNode, long lowerBound, long upperBound){        if(treeNode==null) return true;        if(treeNode.val>=upperBound || treeNode.val<=lowerBound) return false;        return isValid(treeNode.left, lowerBound,treeNode.val) && isValid(treeNode.right, treeNode.val, upperBound);    }

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

你可能感兴趣的文章
LINUX 下Open cv练习使用小记(2)
查看>>
JavaScript基础避免使用eval()(006)
查看>>
面向对象和面向过程的区别
查看>>
内置函数与匿名函数
查看>>
SSH实现登陆拦截器
查看>>
使用HttpWebRequest出错时获取详细的错误信息
查看>>
sql还原(.mdf文件还原)
查看>>
Mellanox infinoband RDMA SDP
查看>>
Nearest Common Ancestors(LCA)
查看>>
JS/atan2 pow
查看>>
Pythoh网络编程3:创建TCP服务器和客户端
查看>>
angularjs 出现 “Possibly unhandled rejection: cancel ”错误
查看>>
bzoj 2653 middle (主席树+二分)
查看>>
指导别人,弥补自己
查看>>
BZOJ3932: [CQOI2015]任务查询系统
查看>>
和make相关的一些命令
查看>>
Fiddler抓取https设置及其原理
查看>>
常用的一些模板
查看>>
WPF使用Expression Design设计图形
查看>>
Ubuntu 下Qt安装实用教程
查看>>