LeetCode每日打卡验证二叉搜索树--中序遍历Or递归

98. 验证二叉搜索树
😭,其实之前做过类似的题,但是一开始的思路还是没想到中序遍历,只是想到递归判断当前节点是否大于等于最大值或者小于等于最小值,针对于左子树,那么最大值应该是当前节点值,右子树那么最小值应该是当前值。根据这个思路就可以开始撸代码了。

 public boolean isValidBST(TreeNode root) {
 	//用long的原因是居然存在测试用例用Int的最大值2,147,483,647
 	return getIsVaildBST(root,Long.MAX_VALUE,Long.MIN_VALUE);
 }
  public boolean getIsVaildBST(TreeNode root ,long max ,long min){
  	if(root == null){
  		return true;
  	}
  	if(root.val>=max || root.val <= min){
  		return false;
  	}
  	return getIsVaildBST(root.left,root.val,min) && getIsVaildBST(root.right,max,root.val);
  }

因为题目的要求是验证二叉搜索树,那么可以得出树的中序遍历(先访问左节点在访问中间节点,然后右节点的最左节点)一定是递增的如果不是递增那么肯定不是二叉搜索树,因此也可以用中序遍历做这道题:
1.递归的方法中序遍历

Integer i;
 public boolean isValidBST(TreeNode root) {
 	if(root== null){
 		return true;
 	}
 	if(!isValidBST(root.left)){
 		//先遍历左树
 		return false;
 	}
 	if(i!=null && root.val<= i){
 		//如果当前值比前一个值小就不成立
 		return false;
 	}
 	i = root.val;
 	//再遍历右节点
 	return isValidBST(root.right)
 }

2.非递归中序遍历,通过栈保存根节点

public boolean isValidBST(TreeNode root) {
	Deque<TreeNode> stack = new ArrayDeque<>();
	Double preNodeVal = Double.MIN_VALUE;
	while(!stack.isEmpty() || root != null){
		while(root != null){
			//遍历左树将当前根节点保存
			stack.add(root);
			root = root.left;
		}
		TreeNode tempTreeNode = stack.removeLast();
		if(tempTreeNode.val<=preNodeVal){
			//比上个节点小的话证明不是递增直接return
			return false;
		}
		preNodeVal = tempTreeNode.val;
		root = tempTreeNode.right;
	}
	 return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值