zoukankan      html  css  js  c++  java
  • 【树】Validate Binary Search Tree

      需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小。如下面非二分查找树,如果只比较节点和其左右孩子的关系大小,它是满足的。

         5
      /    
    4      10
          /      
        3        11

    错误代码:

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {boolean}
     */
    var isValidBST = function(root) {
        if(root==null){
            return true;
        }
        
        if (root.left != null && root.val <= root.left.val){
            return false; 
        } 
        if (root.right != null && root.val >= root.right.val){
            return false;
        }
        return isValidBST(root.left) && isValidBST(root.right);  
        
        
    };

    正确解法

    思路:利用中序遍历将二叉树中所有值存入一个数组,我们知道,二插搜索树用中续遍历的所有值都符合从大到小的顺序,所以,我们就可以通过判断数组中的值是否是从大到小顺序来判断二叉树是否为二插搜索树。

    代码如下:

    var isValidBST = function(root) {
        if(root==null){
            return true;
        }
        
        function asc(x, y) {
            return x > y;
        };
        
        var result=inOrderTraversal(root);var temp=result.concat();
        result.sort(asc);for(var i=0;i<result.length;i++){
            if (result[i]==result[i+1]){
                return false;
            }
        }
        
        if(result.toString()==temp.toString()){
            return true;
        }else{
            return false;
        }
    };
    
    var inOrderTraversal=function(root){
        if(root==null){
            return [];
        }
        if(root.left==null&&root.right==null){
            return [root.val];
        }
        
        var p=root,result=[],stack=[];
        while(p||stack.length!=0){
            if(p!=null){
                stack.push(p);
                p=p.left;
            }else{
                p=stack.pop();
                result.push(p.val);
                p=p.right;
            }
        }
        return result;
    }

    注意几个点:

    • result.concat()目的是为了简历result数组的副本
    • arr.sort()是在原有数组上进行修改
    • 利用toString()方法可以比较两个数组值是否相等
  • 相关阅读:
    TCP并发服务器(一)——每个客户一个子进程
    TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码
    TCP并发服务器(七)——可动态增减的线程池,主线程accept——基于UNP代码修改
    STL源码之vector
    coffee-script安装
    Python模块包中__init__.py文件的作用
    原型模式
    facade模式
    类继承模式
    备忘模式
  • 原文地址:https://www.cnblogs.com/shytong/p/5089494.html
Copyright © 2011-2022 走看看