二叉树的深度

二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。


这也是一道很经典的题,求二叉树的深度是一项基本技能。

一开始是想改造先序遍历,每次传递当前深度进去,然后在叶子节点的时候比较当前深度和一个全局的最大深度,但是看到了一个更简单的方法,我相信这种方法才是正道:

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()

posted @ 2020-03-06 20:02  别再闹了  阅读(201)  评论(0)    收藏  举报