算法:求二叉树的高度

问题引入(树之高度)

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

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

全部评论

相关推荐

起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务