给定一个二叉树,判断它是否是合法的二叉查找树(BST)
一棵BST定义为:
节点的左子树中的值要严格小于该节点的值。
节点的右子树中的值要严格大于该节点的值。
左右子树也必须是二叉查找树。
一个节点的树也是二叉查找树。
您在真实的面试中是否遇到过这个题? Yes
样例
一个例子:
2
/ \
1 4
/ \
3 5
一棵BST定义为:
节点的左子树中的值要严格小于该节点的值。
节点的右子树中的值要严格大于该节点的值。
左右子树也必须是二叉查找树。
一个节点的树也是二叉查找树。
您在真实的面试中是否遇到过这个题? Yes
样例
一个例子:
2
/ \
1 4
/ \
3 5
上述这棵二叉树序列化为 {2,1,4,#,#,3,5}.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
/**
* 给定一个二叉树,判断它是否是合法的二叉查找树(BST)
一棵BST定义为:
节点的左子树中的值要严格小于该节点的值。
节点的右子树中的值要严格大于该节点的值。
左右子树也必须是二叉查找树。
一个节点的树也是二叉查找树。
您在真实的面试中是否遇到过这个题? Yes
样例
一个例子:
2
/ \
1 4
/ \
3 5
上述这棵二叉树序列化为 {2,1,4,#,#,3,5}.
*
* @author Dell
*
*/
public class Test95 {
public static boolean isValidBST(TreeNode root)
{
if(root==null)
return false;
if(root.left==null&&root.right==null)
return true;
List<Integer> list=new ArrayList<>();
Stack<TreeNode> s=new Stack<>();
TreeNode p=root;
while(p!=null||s.isEmpty()!=true)
{
if(p!=null)
{
s.push(p);
p=p.left;
}
else
{
TreeNode temp=s.pop();
list.add(temp.val);
p=temp.right;
}
}
for(int i=0;i<list.size()-1;i++)
{
if(list.get(i+1)<list.get(i))
return false;
}
return true;
}
public static TreeNode insert(TreeNode t, int target)
{
if(t==null)
{
t=new TreeNode(target);
return t;
}
else
{
if(t.val>target)
{
t.left=insert(t.left,target);
return t;
}
else if(t.val<target)
{
t.right=insert(t.right,target);
return t;
}
return t;
}
}
public static void midorder(TreeNode t)
{
if(t!=null)
{
midorder(t.left);
System.out.print(t.val+" ");
midorder(t.right);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<a.length;i++)
{
a[i]=sc.nextInt();
}
TreeNode t=null;
/*for(int i=0;i<a.length;i++)
{
t=insert(t,a[i]);
}*/
t=new TreeNode(4);
t.left=new TreeNode(7);
t.left=new TreeNode(9);
System.out.println(isValidBST(t));
}
}