算法:求二叉树的高度
问题引入(树之高度)
输入描述 对于一个二叉树,输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号 输出描述 输出树的高度,为一个整数 测试用例 输入 5 0 1 0 2 1 3 1 4 输出 3
解决方法
-
使用递归法求树的高度
int getdeep_1(treeType root) { if(root!=null) { //返回树的叶子所在的最深处的高度 return 1+Math.max(getdeep_1(root.left), getdeep_1(root.right)); } return 0; }
-
使用层序遍历求树的高度
int getdeep_2(treeType root) { if(root!=null) { //借用队列先进先出的特性,按层遍历 Queue<treeType> Q=new LinkedList<treeType>(); Q.add(root); int deepth=0;//树的深度 int length=0;//计数器 int count=1;用以判断某一层结点是否都出队 while(!Q.isEmpty()) { treeType head=Q.poll(); count--;//每次弹出,意味着这一层的某个结点已不在队列里了,要减1 if(head.left!=null) { Q.add(head.left); length++; } if(head.right!=null) { Q.add(head.right); length++; } if(count==0) { //count=0标志着一层的结点已经访问完,要更新为下一层的结点数,length重置为0,树的深度加1 count=Q.size(); length=0; deepth++; } } return deepth; } return 0; } }
代码
package james; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class TreeHigh { public static void main(String[] args) { Scanner in=new Scanner(System.in); treeType[] array=new treeType[in.nextInt()]; for(int i=0;i<array.length;i++) { array[i]=new treeType(i); } int LEN=array.length; while(LEN-->1) { int n=in.nextInt(); int m=in.nextInt(); array[n].createTree(array[m]); } System.out.println("method_1:"+array[0].getdeep_1(array[0])); System.out.println("method_2:"+array[0].getdeep_2(array[0])); } } class treeType { treeType left; treeType right; int value; public treeType(int nextInt) { this.value=nextInt; } public treeType() { // TODO Auto-generated constructor stub } //创建二叉树 void createTree(treeType root) { if(root!=null) { if(this.left==null) { this.left=root; return; } if(this.right==null) { this.right=root; return; } else if(this.left!=null && this.right!=null) { System.out.println("子结点已满,无法创建"); return; } } } //递归实现求树的高度 int getdeep_1(treeType root) { if(root!=null) { return 1+Math.max(getdeep_1(root.left), getdeep_1(root.right)); } return 0; } //使用层次遍历求树的高度 int getdeep_2(treeType root) { if(root!=null) { //借用队列先进先出的特性 Queue<treeType> Q=new LinkedList<treeType>(); Q.add(root); int deepth=0; int length=0; int count=1; while(!Q.isEmpty()) { treeType head=Q.poll(); count--; if(head.left!=null) { Q.add(head.left); length++; } if(head.right!=null) { Q.add(head.right); length++; } if(count==0) { count=Q.size(); length=0; deepth++; } } return deepth; } return 0; } }
谁不想成功 梦醒成英雄 在你眼中我不同 (从无到有)