您的位置:首页 > 其它

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

2014-01-03 17:34 381 查看
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##*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐