二叉树------平衡二叉树 搜素二叉树 完全二叉树的判断

平衡二叉树:判断条件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));
	}

猜你喜欢

转载自blog.csdn.net/qq_40516725/article/details/84502002