【小熊刷题】Validate Binary Search Tree <含recursion>

2 篇文章 0 订阅
1 篇文章 0 订阅

Question

Given a binary tree, determine if it is a valid Binary Search Tree (BST).

这里需要注意,是左侧所有的node value都小于root(parent),右侧所有的value都大于它上面的root(parent),每一个node都是一个BST。 书中举了个例子:

10

/ \

5 15 ——– binary tree (1)

/ \

6 20

这样6不应该在右边,所以不是一个valid binary search tree(虽然是binary tree)

最简单的方法就是看每一个node的left child和right child是不是符合规则,就要用到recursion。

先复习一下dave老头曾经强调的recursion四原则:
 Do the base cases first

 Recur only with simpler cases

 Don’t modify and use non-local variables

 Don’t look down

My Solution

Runtime: O(n^2), stack space: O(n)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        return isValidBST(root.left) && isValidBST(root.right)
        && isSubtreeLessThan(root.left, root.val) 
        && isSubtreeGreaterThan(root.right, root.val);
    }

    public boolean isSubtreeLessThan(TreeNode node, int val){
        if(node == null) return true;
        return node.val < val && isSubtreeLessThan(node.left, val) && isSubtreeLessThan(node.right, val);
    } 

    public boolean isSubtreeGreaterThan(TreeNode node, int val){
        if(node == null) return true;
        return node.val > val && isSubtreeGreaterThan(node.left, val) && isSubtreeGreaterThan(node.right, val);
    } 
}

My Initial thoughts - In-order traversal

之前想了一下,觉得如果traverse方法得当应该也可以看得出来,看了书里的hints,确实如此。如果用in-order traversal只要traverse过程中都在increase value就可以了 (strict monotonic increasing order https://en.wikipedia.org/wiki/Monotonic_function


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private TreeNode prev; // store the current previous value
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        return ifMonotonicIncrease(root);
    }
    public boolean ifMonotonicIncrease(TreeNode root){ // in-order is test left and then root and then right
        if(root == null) return true;
        if(ifMonotonicIncrease(root.left)){
            if(prev != null && root.val <= prev.val) return false;
            prev = root;
            return ifMonotonicIncrease(root.right);
        }else{
            return false;
        }
    }

}

第三种方法

书中还说了另一种方法来优化第一种brute force的方法,就是把每个node的值得范围传下去(BFS),如果当前node的值不在范围内就is not valid Binary Search Tree.

具体代码稍后更新~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<body> <div class="container"> <h1 class="title">注册界面</h1> <form name="loginfrm" action="Register" method="post" class="form" onsubmit="return validate()"> <div class="form-group"> <label for="username">用户名:</label> <input type="text" name="username" id="username" class="input-text"> </div> <div class="form-group"> <label for="password1">密码:</label> <input type="password" name="password1" id="password1" class="input-text"> </div> <div class="form-group"> <label for="password2">确认密码:</label> <input type="password" name="password2" id="password2" class="input-text"> </div> <div class="button-group"> <input name="button" type="submit" value="注册" class="button"> </div> </form> </div> </body> <style> .container { margin: 0 auto; width: 500px; } .title { margin: 30px 0; text-align: center; font-size: 36px; } .form { background-color: #f7f7f7; padding: 20px; border-radius: 5px; } .form-group { margin-bottom: 20px; } .form-group label { display: block; margin-bottom: 5px; font-size: 18px; } .input-text { width: 100%; padding: 10px; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } .button-group { margin-top: 20px; text-align: center; } .button { padding: 10px 20px; background-color: #0072c6; color: #fff; border: none; border-radius: 5px; font-size: 18px; cursor: pointer; } .button:hover { background-color: #005499; } </style> <script> function validate() { var username = document.getElementById("username").value.trim(); var password1 = document.getElementById("password1").value.trim(); var password2 = document.getElementById("password2").value.trim(); if (username === "" || password1 === "" || password2 === "") { alert("请填写完整信息!"); return false; } if (password1 !== password2) { alert("两次密码输入不一致!"); return false; } return true; } </script>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值