剑指 offer 笔记 38 | 二叉树的深度

2019-11-10  本文已影响0人  ProudLin

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

思路分析
1)如果一棵树只有一个结点,它的深度为 1。

2)如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加 1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加 1。

3)如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加 1。

所以可以用递归的方式来实现。

解释说明:

public class Solution {
    public int TreeDepth(TreeNode root) {
        //递归的出口,root为0则返回0,这里可以理解为root为0那肯定没有层数了
        if(root == null){
            return 0;
        }
        //拿到左子树的最大深度
        int nLeft = TreeDepth(root.left);
        //拿到右子树的最大深度
        int nRight = TreeDepth(root.right);
        //找出最大值,并且加上 root 这一层即可
        int depth =  (nLeft > nRight)?(nLeft + 1):(nRight + 1);
        return depth;
    }
}

关于递归的我有点看不懂,于是我去查看了一些资料:https://blog.csdn.net/weixin_38383877/article/details/89363080

非递归方式

import java.util.LinkedList;
import java.util.Queue;

public class Solution {

 public int TreeDepth(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;
  }
}

参考《剑指offer》 第 2 版 P272

上一篇下一篇

猜你喜欢

热点阅读