码迷,mamicode.com
首页 > 其他好文 > 详细

98. Validate Binary Search Tree

时间:2017-07-26 12:41:34      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:方法   arc   int   中序遍历   操作   date   全局变量   rmi   tree   

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 nodes key.
The right subtree of a node contains only nodes with keys greater than the nodes key.
Both the left and right subtrees must also be binary search trees.
Example 1:
    2
   /   1   3
Binary tree [2,1,3], return true.
Example 2:
    1
   /   2   3
Binary tree [1,2,3], return false.

 

用的中序遍历, 分治法, 维护了一个全局变量

public boolean isValidBST(TreeNode root) {  
    ArrayList<Integer> pre = new ArrayList<Integer>();  
    pre.add(null);  
    return helper(root, pre);  
}  
private boolean helper(TreeNode root, ArrayList<Integer> pre)  
{  
    if(root == null)  
        return true;  
    boolean left = helper(root.left,pre);  
    if(pre.get(0)!=null && root.val<=pre.get(0))  
        return false;  
    pre.set(0,root.val);  
    return left && helper(root.right,pre);  
}  

第二种方法: 题意的转化: 根据题目中的定义来实现,其实就是对于每个结点保存左右界,也就是保证结点满足它的左子树的每个结点比当前结点值小,右子树的每个结点比当前结点值大

这个是改变的输入值, 其实也是先操作最小的节点值, 在将题意转化为内部操作, 再递归 , 只不过内部操作转化为了输入值.

/**
 * 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) {
        return check(root, Long.MAX_VALUE, Long.MIN_VALUE);
    }
    private boolean check(TreeNode root, long max, long min) {
        if (root == null) return true;
        
        
        boolean left = check(root.left, root.val, min);
        boolean right = check(root.right, max, root.val);
        if (root.val >= max || root.val <= min) return false;
        
        return left && right;
    }
}

  

 考的是题意的转化即内部操作 

方法三: 将题意转化为类中的元素, 对类进行操作, 套路固定, 同108. Convert Sorted Array to Binary Search Tree

树节点常构造类, 把题意转化成类中元素, 操作类中的元素, 跟法二差不多, 

//改的是返回值类型, 不过题意也都放在返回值类型里面
class ResultType {
    boolean is_BST;
    int maxValue, minValue;
    ResultType(boolean is_BST, int maxValue, int minValue) {
        this.is_BST = is_BST;
        this.maxValue = maxValue;
        this.minValue = minValue;   
    }
}
public class Solution {
       public boolean isValidBST(TreeNode root) {
        // write your code here
        ResultType result = helper(root);
        return result.is_BST;
        
    }
    //改的是返回值类型, 不过题意也都放在返回值类型里面
    private ResultType helper(TreeNode root) {
        if (root == null) {
            
            // 当遇到null是, int 多赋值为Integer.MAX_VALUE,Integer.MIN_VALUE
            //具体是什么看 后面与null类型的节点的比较
            //此处为了后面的比较 与空节点比较时, 最大值等于根节点的最大值,最小值等于根节点的最小值.
            return new ResultType(true, Integer.MIN_VALUE, Integer.MAX_VALUE);
        }
        
        // divide
        ResultType left = helper(root.left);
        ResultType right = helper(root.right);
        
        //conquer: 从底往上回溯
        if (!left.is_BST || !right.is_BST || root.left != null && left.maxValue >= root.val 
        || right.minValue <= root.val && root.right !=null) { return new ResultType(false, Integer.MIN_VALUE, Integer.MAX_VALUE); } //题意的转化尽显在构造类中 return new ResultType(true, Math.max(root.val, right.maxValue), Math.min(root.val, left.minValue)); } }

  

 

98. Validate Binary Search Tree

标签:方法   arc   int   中序遍历   操作   date   全局变量   rmi   tree   

原文地址:http://www.cnblogs.com/apanda009/p/7238803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!