问题描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树,假设一个二叉搜索树具有以下特征:节点的左子树质保函小于当前节点的数,节点的右子树质保函大于当前节点的数,所有左子树和右子树本身也是二叉搜索树。
中序遍历求解:对于一颗二叉搜索树而言,其中序遍历结果是有序的。
递归方式求解:定义一个全局的变量用于存储之前访问的那个元素,只要中序遍历过程中小于这个值的话,则表明不是二叉搜索树,若大于这个pre,则更新pre,并进入下一次递归。
int pre=Integer.MIN_VALUE; public Boolean isBinarySearch(TreeNode root) { if(root==null){return true;} Boolean left=isBinarySearch(root.left); if(left==false){return false;} if(root.val将所有的结果都放入链表中,最后来判断该链表是否是递增的,若是则返回true,若不是,则返回false。
public void isBinarySearch(TreeNode root,Listlist) { if(root==null){return;} isBinarySearch(root.left,list); list.add(root); isBinarySearch(root.right.list); } public Boolean IsBinarySearch(TreeNode root) { List list=new LinkedList<>(); isBinarySearch(root,list); int pre=list.get(0).val; for(int i=1;i 递归求解:通过一层层的遍历每个节点逐一判断
public Boolean isBinarySearch(TreeNode root) { if(root.left==null&&root.right==null){return true;} else if(root.left==null&&root.right!=null) { if(root.right.valroot.val){return false;} else{ return isBinarySeach(roo.left); } }else { if(!(root.left root.val)){return false;} else { return isBinarySearch(roo.left)&&isBinarySearch(root.right); } } } } 非递归方式使用栈来求解,后进栈的先处理,符合树的求解过程,
public Boolean isBinarySearch(TreeNode root) { TreeNode pre; pre.val=Integer.MIN_VALUE; Stackstack=new Stack<>(); TreeNode current=root; while(current!=null||stack!=null) { while(current!=null){stack.push();current=current.left;} current=statck.pop(); if(current.val