需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样。这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小。如下面非二分查找树,如果只比较节点和其左右孩子的关系大小,它是满足的。
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()方法可以比较两个数组值是否相等