树的双亲表示法可执行代码(创建树,层次遍历,求深度)

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

//双亲表示法创建
public class PTree<AnyType>{
	PTNode nodes[]=new PTNode[15];
	int n;                  //结点在数组中的位置
	PTNode rootNode;
	class PTNode<AnyType>{
		char data;
		int parent;
		public PTNode(char d,int p){
			this.data=d;
			this.parent=p;
		}
		public PTNode(char d){
			this.data=d;
		}
	}
	public PTree(){
		n=0;
	}
	int m;
	public PTNode creatTree(){
		Queue<PTNode> q=new LinkedList<PTNode>();              //存放结点的data
		Queue<Integer> q2=new LinkedList();                    //存放结点在数组中的位置,以便其孩子结点容易获得parent域
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入根节点");
		String a=sc.next();
		char b[]=a.toCharArray();           //把字符串转换成字符数组
		if(b[0]!='#'){           //根结点存在
			rootNode=new PTNode(b[0],-1);
			nodes[0]=rootNode;
			q.add(rootNode);
			q2.add(n);
			n++;
			while(!q.isEmpty()&&n<nodes.length){
				PTNode p=q.remove();
                System.out.println("请输入"+p.data+"的所有孩子,若没有输入# :");
                int par=q2.remove();             //该结点的父亲在数组中的位置
                String c=sc.next();
                char d[]=c.toCharArray();
                if(d[0]!='#'){
                	for(int i=0;i<d.length;i++){
                		nodes[n]=new PTNode(d[i],par);
                		q.add(nodes[n]);
                		q2.add(n);
                		n++;	
                		m=n;
                	}
                	if(n>nodes.length){
                		increaseSpace(nodes.length+15);
                	}
                }
                
			}
			
		}
		else
			rootNode=null;
		return rootNode;
	}
	public void increaseSpace(int newSpace){      //扩容
		int size=nodes.length;
		PTNode b[]=nodes;
		nodes=new PTNode[newSpace];
		for(int i=0;i<size;i++){
			nodes[i]=b[i];
		}
		
	}
	 public int depth(){
	    	int max=0,height,p=0;      //max记录当前的最大高度,p记录双亲结点的位置,height为当前的深度
	    	for(int i=0;i<n;i++){
	    		height=1;               //每次循环开始,初始化height
	    		p=nodes[i].parent;
	    		while(p!=-1){         //若当前结点不是根结点,执行此循环
	     			p=nodes[p].parent;      //不断沿双亲结点向上走
	     			height++;               //没向上一步,高度加一
	    		}
	    		if(height>max)           //记录当前最大深度
	    			max=height;
	    	}
	    	return max;
	     }
	//层次非递归遍历
	 public  void levelQueueOrder(){
		 System.out.print(nodes[0].data);
		 for(int i=0;i<m;i++){
			 for(int j=i+1;j<m;j++){
				 if(nodes[j].parent==i){
					 System.out.print(nodes[j].data);
				 }
				 
			 }
		 }
	 }
	 
	 
	public static void main(String[] args) {
		PTree pt=new PTree();
	    pt.creatTree();
	    System.out.println("层次遍历");
	    pt.levelQueueOrder();
	    System.out.println();
	    System.out.println("树的深度");
        System.out.println(pt.depth());
		
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光光-Leo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值