二叉搜索树:每个节点左边节点小于右边节点,左子树的最大值一定小于根节点,小于右子树的最大值;通过中序遍历,严格递增
完全二叉树:层序遍历,除了最后的一层,每层都是满的
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /* * @param root TreeNode类 the root * @return bool布尔型一维数组 */ public boolean[] judgeIt (TreeNode root) { // write code here if(root==null){ return new boolean[]{false,false}; } ArrayList<Integer> list = new ArrayList<>(); midsearch(root,list); boolean flag1=true; for(int i=1;i<list.size();i++){ if(list.get(i)<list.get(i-1)){ flag1=false; break; } } boolean flag2=isCompleteTree(root); return new boolean[]{flag1,flag2}; } public void midsearch(TreeNode root,ArrayList<Integer> list){ // 中序遍历 if(root==null){ return ; } midsearch(root.left,list); list.add(root.val); midsearch(root.right,list); } public boolean isCompleteTree(TreeNode root){ // 判断一棵树是否为完全二叉树,层序遍历,一旦出现null //则队列中剩余的节点必须为叶子节点 Queue<TreeNode> queue=new LinkedList<TreeNode>(); queue.add(root); while(!queue.isEmpty()){ TreeNode cur=queue.poll(); if(cur.left==null){ // 遍历每个节点 if(cur.right!=null){ return false; } while(!queue.isEmpty()){ TreeNode p=queue.poll(); if(p.left!=null || p.right!=null){ return false; } } return true; } else{ queue.add(cur.left); } if(cur.right==null){ while(!queue.isEmpty()){ TreeNode q=queue.poll(); if(q.right!=null || q.left!=null){ return false; } } return true; } else{ queue.add(cur.right); } } return true; } }
// 搜索二叉树:中序遍历是左中右,而搜索二叉树就是 左 < 中 < 右,
//稍加改动,将弹出的值用一个变量保存(可以初始化为系统最小值),比较大小
public static boolean isBST (Node head) {
if (head == null) {
return true;
}
Stack<Node> stack = new Stack<Node>();
int pre = Integer.MIN_VALUE;
// 这里定义一个系统最小数,用于下面的和前面的数比较
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
// --------这里本来是中序遍历打印节点的地方,这里改成和前面的节点值比较,
//如果大于,直接返回false,否则迭代------------
if (head.value < pre) {
// 搜索二叉树默认节点不相等,若相等,就会变成同一个节点
return false;
} else {
pre = head.value;
}
// -------------------------------------------
head = head.right;
}
}
return true;
}// 这里是判断二叉树是否是完全二叉树,
// 这里用到两个技巧:1、用queue来层级遍历,2、每个节点的左右节点有四种情况:左空右空,左有右空,左空右有,左有右有
// 其中如果左空右有,直接返回false,如果左空右空,左有右空,那么接下来的节点一定是叶节点
public static boolean isCBT(Node head){
if(head==null){
return true;
}
Queue<Node> queue=new LinkedList<Node>();
boolean leaf=false;
Node l=null;
Node r=null;
queue.offer(head);// 想queue里面增加元素
while(!queue.isEmpty()){
head=queue.poll();
l=head.left;
r=head.right;
/**
* 判断完全二叉树的两个标准:
*①某个节点有右孩子没有左孩子,则不是完全二叉树
*②满足①的条件下,某个节点没有右孩子有左孩子,或者没有左右孩子时,
* 后面遇到的所有节点必须是叶节点。
**/
// 右节点不为空但是左节点为空,直接返回false
if((leaf&&(l!=null || r!=null)) || (l==null&&r!=null)){
return false;
}
// 其他情况,往queue里面存节点
if (l != null) {
queue.offer(l);
}
if (r != null) {
queue.offer(r);
}
if(l==null || r==null){
leaf=true;
}
}
return true;
}
京公网安备 11010502036488号