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

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##*

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/u012116457/article/details/17795263
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞