从零学算法

104.给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],

  3
 /  \
9   20
   /  \
  15   7

返回它的最大深度 3 。

  • 我的原始人解法:首先树的问题我们通常由两种递归方式,分别是自顶向下和自底向上,该题采用自顶向下。从根节点开始,根节点的深度为 1,不断往下递归时深度不断加 1 就是递归时该节点的深度,此外用一个初始最大深度 max 初始为 1,当遍历到叶节点时比较该节点深度和 max 取最大值即可。
  •   public int maxDepth(TreeNode root) {
          return solve(root,1,1);
      }
      public int solve(TreeNode root, int tempMax, int maxVal){
      	// 这个节点都为 null 了,深度肯定为 0 了
          if(root == null){
              return 0;
          }
          // 如果左右都没结点,那就是叶节点,比较一下
          if(root.left == null && root.right == null){
              return Math.max(tempMax,maxVal);
          }
          // 否则就继续往下递归这棵树,深度 + 1
          return Math.max(solve(root.left,tempMax+1,maxVal),solve(root.right,tempMax+1,maxVal));
      }
    
  • 他人解法:首先其实不需要用额外变量记录最大值,如果 root 为 null 说明这一层的深度不该加,返回 tempMax -1 即可,否则就返回左右节点的最大深度。
  • 也就是如下:
  •   public int maxDepth(TreeNode root) {
          return solve(root,1);
      }
      public int solve(TreeNode root, int tempMax){
          if(root == null){
              return tempMax-1;
          }
          return Math.max(solve(root.left,tempMax+1),solve(root.right,tempMax+1));
      }
    
  • 然而其实这个深度也不需要用额外变量记录,加在 return 处即可,也就是如下:
  •   public int solve(TreeNode root){
          if(root == null){
              return 0;
          }
          return Math.max(solve(root.left)+1,solve(root.right)+1);
      }
    
  • 到了这一步其实写成一行代码也就可以了:
  •   public int maxDepth(TreeNode root) {
          return root == null? 0 : Math.max(maxDepth(root.left),maxDepth(root.right))+1;
      }
    
  • 当然,参考之前提到过层序遍历,最大深度不就是层数,用队列从根节点开始入队,遍历时不断出队根节点并入队左右结点,每次遍历完一层就深度加 1 即可:
  •   public int maxDepth(TreeNode root) {
          if (root == null)
              return 0;
          //创建一个队列
          Deque<TreeNode> deque = new LinkedList<>();
          deque.push(root);
          int count = 0;
          while (!deque.isEmpty()) {
          	// 当前层节点数
              int size = deque.size();
              // 遍历当前层,把这一层的出队,下一层入队
              while(size-->0){
                  TreeNode node = deque.poll();
                  if(node.left!=null){
                      deque.addLast(node.left);
                  }
                  if(node.right!=null){
                      deque.addLast(node.right);
                  }
              }
              count++;
          }
          return count;
      }
    

你可能感兴趣的:(算法学习,算法,java,开发语言)