package tree; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue; /** * 给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。 */ public class judge { public static class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public static void main(String[] args) { TreeNode tr=new TreeNode(1); tr.left=new TreeNode(2); tr.right=new TreeNode(3); tr.left.left=new TreeNode(4); tr.left.right=new TreeNode(5); // tr.right.left=new TreeNode(6); // tr.right.right=new TreeNode(7); judgeIt(tr); } /** * * @param root TreeNode类 the root * @return bool布尔型一维数组 */ public static boolean[] judgeIt (TreeNode root) { // write code here if(root==null){ return new boolean[2]; } boolean []result=new boolean[2]; result[0]=judgeSearch(root); result[1]=judgeComple(root); return result; } public static boolean judgeSearch (TreeNode root) { //判断搜索二叉树 //中序遍历 //结果升序是搜索二叉树 ArrayList<Integer> list=new ArrayList<>(); helper(root,list); ArrayList<Integer> result= (ArrayList<Integer>) list.clone(); Collections.sort(list); for(int i=0;i<list.size();i++){ if(list.get(i)!=result.get(i)){ return false; } } return true; } public static void helper (TreeNode root,ArrayList<Integer> list) { if(root==null){ return; } helper(root.left,list); list.add(root.val); helper(root.right,list); return; } public static boolean judgeComple(TreeNode root) { //判断完全二叉树 //树为空直接返回false //否则层序遍历,如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列; //2.1>如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树; //如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树 if(root==null){ return false; } Queue<TreeNode> q=new LinkedList<>(); q.offer(root); while(!q.isEmpty()){ TreeNode t=q.peek(); int x=q.size(); if(t.left!=null&&t.right!=null){ q.poll(); q.offer(t.left); q.offer(t.right); }else if(t.left==null&&t.right!=null){ return false; }else if(t.left!=null&&t.right==null||t.left==null&&t.right==null){ q.poll(); for(int i=0;i<x;i++){ if(q.peek().left!=null||q.peek().right!=null){ return false; } } return true; } } return true; } }