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()方法可以比较两个数组值是否相等
  • 相关阅读:
    [转载]IntelliJ IDEA常用设置
    sql server字段合并逗号隔开
    sql server字段合并逗号隔开
    [转载]Hana 学习资源
    SQL Server数据库实现异地备份
    SQL Server数据库实现异地备份
    SQL Server blocked access to procedure 'sys.xp_cmdshell'
    调用另一个进程,createprocess返回值正确,但被调进程连入口函数都没进入。
    需求做完后,需要拉相关人员确认下结果
    exe崩溃用windbgattach后有宝贵现场,可看程序退出线程等,千万不要清屏
  • 原文地址:https://www.cnblogs.com/shytong/p/5089494.html
Copyright © 2011-2022 走看看