• 二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)


    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    import java.util.Stack;
    
    
    public class BTree<AnyType  extends Comparable<? super AnyType>> {
    
    	BTNode root=new BTNode();
    	
    	 class BTNode<AnyType>{
    		char data;
    		BTNode<AnyType> left;
    		BTNode<AnyType> right;
    		public BTNode(){
    			data=0;
    			left=right=null;
    		}
    		public BTNode(char data){
    			this.data=data;
    			left=right=null;
    		}
    		
    	}
    		int num=0;      //计算节点数
    	 //先序创建二叉树
            char d[]=new char[100];
    		int i=0;
    		public BTNode preCreatTree(){
    			BTNode node=null;
    		    if(d[i]!='*'){
    			    if(d[i]=='#'){
    				    node=null;
    				    i++;
    			    }
    			    else{
    			    	num++;
    				    node=new BTNode(d[i]);
    				    i++; 
    				    node.left=preCreatTree();   
    				    node.right=preCreatTree();			
    			}
    			}
    			return node;
    		}
    	    //层次非递归遍历
    		public void levelOrder(BTNode root){
    			int i=0;
    			Queue<BTNode> q=new LinkedList<BTNode>();
    			q.add(root);
    			while(q.isEmpty()!=true){
    				BTNode step=q.remove();
    				System.out.print(step.data);
    				if(step.left!=null){
    					q.add(step.left);
    				}
    				if(step.right!=null){
    					q.add(step.right);
    				}
    			}
    			System.out.println();
    		}
    		//叶子结点个数
    		int count=0;                 //统计叶子个数
    		public int leaf(BTNode root){
    			if(root!=null){
    				if(root.left==null&&root.right==null)
    					count++;
    				leaf(root.left);
    				leaf(root.right);
    			}
    			return count;
    		}
    		
    		//交换左右子树
    		public void exchange_left_right(BTNode root){
    			if(root==null)
    				return;
    			BTNode step=root.left;
    			root.left=root.right;
    			root.right=step;
    			exchange_left_right(root.left);
    			exchange_left_right(root.right);
    		}	
       
      //判断一棵二叉树是否为完全二叉树,如果是,转换成顺序存储
    	char comp[];
    
    	//Queue<BTNode> qc=new LinkedList<BTNode>();
    	public boolean isCompBTree(BTNode root){
    		BTNode r=root;
    		boolean isComp=true;                       //是否是完全二叉树
    		boolean noHasTwoChild=false;               //是否没有两个孩子,即只有一个孩子或没有孩子	                          
    		Queue<BTNode> q=new LinkedList<BTNode>();
    		q.add(root);
    		while(!q.isEmpty()){
    			BTNode p=q.remove();
    			if(!noHasTwoChild){                             //找到第一个只有左孩子或没有孩子的点后,转向else,不再走这部分
    				if(p.left!=null&&p.right!=null){            //既有左孩子,又有右孩子
    					q.add(p.left);
    					q.add(p.right);
    					
    				}
    				if(p.left!=null&&p.right==null){           //有左无右
    					noHasTwoChild=true;
    					q.add(p.left);
    				}
    				if(p.left==null&&p.right!=null){           //有右无左,不是完全二叉树
    					noHasTwoChild=true;
    					isComp=false;
    					break;
    				}
    				if(p.left==null&&p.right==null){                                      //无左无右
    					noHasTwoChild=true;
    				}
    			}
    			if(noHasTwoChild){                                        //已经找到没有两个孩子的点,若其后存在一点有孩子,则不是完全二叉树
    				if(p.left!=null||p.right!=null){
    					isComp=false;
    					break;
    				}
    			}
    		}
    		if(isComp)	
    		    return true; 
    	    else
    			return false;
    	}
    	public int number(BTNode root){
    		return num;
    	}
    //转成顺序存储
    	public char[] sx(BTNode root){
    		if(isCompBTree(root)==true){
    			Queue<BTNode> q=new LinkedList<BTNode>();
    		    char comp[]=new char[num];
    		    System.out.println(num);
    	        q.add(root);
    	        int i=0;
    			while(!q.isEmpty()){
    				BTNode step=q.remove();
    				comp[i]=step.data;
    				System.out.println(comp[i]);
    				i++;
    				if(step.left!=null){
    					q.add(step.left);
    				}
    				if(step.right!=null){
    					q.add(step.right);
    				}
    			}		
    		
    		}
    		 return comp;
    	}
    /*//判断一棵二叉树是不是堆
    	public boolean isHeap(BTNode root){
    		char h[]=sx(root);
    		int temp=2;
    		if(h.length>=3){
    			if(h[1]>h[2]&&h[1]>h[3]){                 //大顶堆
    				while(temp<=(number(root)/2)&&h[temp]>=h[temp]&&h[temp]>=h[temp*2+1]){
    					temp++;
    				}
    				if(temp==number(root)/2+1)
    					return false;
    				else
    					return true;	
    
    			}
    			else if(h[1]<h[2]&&h[1]<h[3]){                     //小顶堆
    				while(temp<=(number(root)/2)&&h[temp]<h[temp]&&h[temp]<h[temp*2+1])
    				{
    					temp++;
    				}
    				if(temp==number(root)/2+1)
    					return true;
    				else
    					return false;
    				
    			}
    			else
    				return false;
    		}
    		else
    			return false;
    	}
    	
    	*/
    	//判断一棵二叉树是不是堆,有点麻烦
    	public boolean isHeap(BTNode root){
    		boolean isheap=true;         //是否是堆
    		boolean flag=true;           //flag==true,根最大
    		int count=0;
    		Queue<BTNode> qd=new LinkedList<BTNode>();
    		if(isCompBTree(root)){        //是完全二叉树
    			qd.add(root);
    			while(!qd.isEmpty()){
    				BTNode step=qd.remove();
    				if(step.left!=null){      //判断是否是叶子
    					if(step.right!=null){   //有两个孩子       
    						 compareLeft=((AnyType)(Object)step.left.data).compareTo((AnyType)(Object)step.data);
    					     compareRight=((AnyType)(Object)step.right.data).compareTo((AnyType)(Object)step.data);
    						//System.out.println(step.left.data);
    						 //System.out.println(step.right.data);
    					     if(flag==true&&compareLeft<=0&&compareRight<=0){      //根节点最大的堆
    								count++;
    						 if(step.left.left!=null)          //左孩子不是叶子
    								     qd.add(step.left);
    	                            if(step.right.left!=null)         //右孩子不是叶子
    								     qd.add(step.right);
    							}
    					     if(flag==true&&(compareLeft>0||compareRight>0)){    //不满足树或子树根最大
    					    	 if(count!=0){                         //有些结点满足根最大
    					    		 isheap=false;	                 //不是堆
    					    		 break;
    					    	 }	 
    					    	 flag=false;                          //否则令flag=false,判断其是否为根最小的堆
    					     }
    					    
    					    if(flag==false&&compareLeft>=0&&compareRight>=0){          //根节点最小的堆
    					    	 if(step.left.left!=null)
    							     qd.add(step.left);
                                 if(step.right.left!=null)
    							     qd.add(step.right);
    					     }
    					    if(flag==false&&(compareLeft<0||compareRight<0)){       //不满足根最小         				    	 
    					    	isheap=false;                //不是堆
    					    	break;
    					     }
    					}
    					else{                      //有一个孩子,
    						compareLeft=((AnyType)(Object)step.left.data).compareTo((AnyType)(Object)step.data);
    						compareRight=0;
    						if(flag==true&&compareLeft<=0){      //根节点最大的堆
    							count++;
    							if(step.left.left!=null)
    							     qd.add(step.left);
    						}
    				        if(flag==true&&compareLeft>0){
    				    	    if(count!=0){
    				    		   isheap=false;
    				    		    break;
    				    	     } 	 
    				    	     flag=false;
    				     }
    				    
    				     if(flag==false&&compareLeft>0){          //根节点最小的堆
    				    	 if(step.left.left!=null)
    						     qd.add(step.left);
    				     }
    				     if(flag==false&&compareLeft<=0){ 
    				    	isheap=false;
    				    	break;
    				     }
    						
    					}						
    				}
    	
    			}
    		}
    		else{
    			isheap=false;
    		}
    		return isheap;
    	}
     
    	//判断是否为二叉查找树
    		int compareLeft;
    		int compareRight;
    		public boolean ifBSTree(BTNode root){
    			if(root!=null){
    				if(root.left!=null&&root.right!=null){
    				     compareLeft=((AnyType)(Object)root.left.data).compareTo((AnyType)(Object)root.data);
    				     compareRight=((AnyType)(Object)root.right.data).compareTo((AnyType)(Object)root.data);
    				}
    				if(root.right!=null&&root.left==null){
    				      compareRight=((AnyType)(Object)root.right.data).compareTo((AnyType)(Object)root.data);
    				      compareLeft=-1000;
    				}
    				if(root.right==null&&root.left!=null){
    					compareLeft=((AnyType)(Object)root.left.data).compareTo((AnyType)(Object)root.data);
    					 compareRight=1000;
    				}
    				 if(compareLeft>=0||compareRight<=0)
    					return false;
    				else{
    					ifBSTree(root.left);
    					ifBSTree(root.right);
    				}
    					
    			}
    			return true;
    		}
    	public static void main(String[] args) {
    		BTree bt=new BTree();
    		Scanner sc=new Scanner(System.in);
    		System.out.println("请输入数据:");
    		String a=sc.next();
    		char b[]=a.toCharArray();
    		for(int i=0;i<b.length;i++){
    		     bt.d[i]=b[i];
    		}
    		bt.root=bt.preCreatTree();
    
    		System.out.print("层次遍历: ");
    		bt.levelOrder(bt.root);
    		
    		System.out.print("叶子结点个数     ");
    		System.out.println(bt.leaf(bt.root));
    		
    		System.out.print("是否为二叉查找树    ");
    		System.out.println(bt.ifBSTree(bt.root));
    		
    		System.out.println("是否为完全二叉树    "+bt.isCompBTree(bt.root));
    		
    		System.out.println("是否为堆    "+bt.isHeap(bt.root));
    	
    		System.out.print("交换左右子树后层次遍历      ");
    		bt.exchange_left_right(bt.root);
    		bt.levelOrder(bt.root);
    	}
    
    }
    
    
    //abd###ce##f##*

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    迟到感悟
    让自己记住吧。
    hadoop 数据抽取
    指标导入常用函数
    linux shell中单引号、双引号、反引号、反斜杠的区别
    简单解说Linux命令输出与命令替换
    生成表结构
    ASP.NET MVC3在Visual Studio 2010中的变化
    主键自增归0
    解决包含已存在的php文件,但提示就是找不到的问题
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931844.html
Copyright © 2020-2023  润新知