算法:求二叉树的高度

算法与数据结构 专栏收录该内容
19 篇文章 0 订阅

问题引入(树之高度)

输入描述
对于一个二叉树,输入的第一行表示节点的个数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;
	}
}

谁不想成功
梦醒成英雄
在你眼中我不同
(从无到有)

  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值