1.题目:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
2.思路:
方法一:递归
写法构思:传入某节点,调用该方法,返回的应该是以传入节点为根节点的树的深度,而树的深度,肯定和左右子树深度有关,所以进入这个方法后,就包含了左右子树的深度(而要得到左右子树的深度,肯定又是以左右子节点为根节点,再次调用该方法深度获取的,因此此时进行递归),并且还有由一个左右深度比较的过程,然后取较大值,这个较大值就是该节点左右子树深度较深的值,以该值+1作为返回值,就是该节点的深度。
public class Solution { public int TreeDepth(TreeNode root) { if(root==null){ return 0; } int left=TreeDepth(root.left); int right=TreeDepth(root.right); return Math.max(left,right)+1; } }
方法二:层序遍历+队列
利用的队列,首先入队的是根节点,使其入队,遍历某个节点时,将该节点出队,并将该节点的所有子节点入队,当同一深度的节点都遍历完的时候,深度++,所以设depth是深度。
import java.util.Queue; import java.util.LinkedList; public class Solution { public int TreeDepth(TreeNode root) { if(root==null){ return 0; } Queue<TreeNode>queue=new LinkedList<TreeNode>();//队列 queue.add(root); int deepth=0;//记录深度 while(queue.size()!=0){//到底 deepth++; for(int i=0;i<queue.size();i++){//循环读取每一层 TreeNode node=queue.poll();//先出队列 if(node.left!=null){//若有左子节点,加入队列 queue.add(node.left); } if(node.right!=null){//若有右子节点加入队列 queue.add(node.right); } } } return deepth; } }