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
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/u012116457/article/details/17795263
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。