二叉树的深度
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
这也是一道很经典的题,求二叉树的深度是一项基本技能。
一开始是想改造先序遍历,每次传递当前深度进去,然后在叶子节点的时候比较当前深度和一个全局的最大深度,但是看到了一个更简单的方法,我相信这种方法才是正道:
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;
}
这个递归版非常简洁,并且恰好地起到了它的作用,体现了递归的“预先假设函数功能”的思维
非递归版,使用队列:count是当前的节点,nextcount是当前深度总的节点。【总是要遍历到当前深度的最后一个节点,深度才加1】
import java.util.LinkedList;
import java.util.Queue;
public int TreeDepth1(TreeNode root) {
if(root==null) {
return 0;
}
Queue<TreeNode> q=new LinkedList<TreeNode>();
q.add(root);
int d=0,count=0,nextcount=q.size();
while(q.size()!=0) {
TreeNode t=q.poll();
count++;
if(t.left!=null) {
q.add(t.left);
}
if(t.right!=null) {
q.add(t.right);
}
/*
当当前层访问完后,下一层的节点都已经入队列
*/
if(count==nextcount) {
d++;
count=0;
nextcount=q.size();
}
}
return d;
注意,Java队列的实现类是LinkedList
再复习一遍,Queue的放入方法叫offer(),取出叫poll(),查看队列头方法是peek()

浙公网安备 33010602011771号