平衡二叉树:判断条件1)左树是否平衡2)右树是否平衡 3)高度 左树右树相差高度不大于1
public static boolean isBalance(Node head){
if(head==null)
return true;
if(Math.abs(getHeight(head.left)-getHeight(head.right))>1)
{return false;}
return isBalance(head.left)&&isBalance(head.right);
}
public static int getHeight(Node head){
if(head==null){
return 0;
}
int left=getHeight(head.left);
int right=getHeight(head.right);
return left>right?left+1:right+1;
}
完全二叉树 :每一层从左往右没有间断。自己动手画画图 一目了然
主要思路:条件一:当左子树为空,右子树不为空时,就返回false head.left==null&&head.right!=null
条件二:当节点非满时,即在左子树不为空右子树为空 或者左右子树都为空的情况下 要求该节点之后的节点要为叶子节点。
代码:用leaf 来标记是否开启条件二,leaf=false 是代表没有开启 去检查是否为叶子节点这一条件。leaf =true 则代码需要去检测是否是叶子节点。
//判断是否是完全二叉树
public static boolean isCBT(Node head){
if(head==null){
return true;
}
Queue<Node> queue =new LinkedList<Node>();
boolean leaf=false;
queue.add(head);
while(!queue.isEmpty()){
head=queue.poll();
if((leaf&&(head.left!=null||head.right!=null))||(head.left==null&&head.right!=null)){
return false;
}
if(head.left!=null)
queue.add(head.left);
if(head.right!=null){
queue.add(head.right);
}else{
leaf=true;
}
}
return true;
}
求完全二叉树的节点个数 要求时间复杂度要低于O(N)
分析:当右子树左边界到达最后一层 则左子树是满 2^(h-level+1) -1+1+右子树的节点数
当右子书左边界未到达最后一层,则总节点数为2^(h-level)-1+1+左子树的节点数。注意代码中的传入的level 与此处的level值略有不同。在此过程中都应用到了递归思想。
public static int competeTreeNote(Node head){
if(head==null){
return 0;
}
return bs(head,1,height(head,1));
}
public static int bs(Node head, int l, int h) {
if(l==h){
return 1;
}
if(height(head.right,l+1)==h){
return (1<<(h-l))+bs(head.right,l+1,h);//此处注意括号,+优先级别比<<高
}else{
return (1<<(h-l-1))+bs(head.left,l+1,h);
}
}
public static int height(Node head,int level){
while(head!=null){
head=head.left;
level++;
}
return level-1;
}
public static void main(String[] args) {
Node node =new Node(1);
node.left=new Node(2);
node.left.left=new Node(4);
node.left.right=new Node(5);
node.left.left.left=new Node(8);
node.left.left.right=new Node(9);
node.right=new Node(3);
node.right.left=new Node(6);
node.right.right=new Node(7);
System.out.println(competeTreeNote(node));
}