vlambda博客
学习文章列表

树的深度优先、广度优先easy题

树的深度优先、广度优先easy题

习题来自于leetCode深度优先课程后续练习推荐习题。【https://leetcode-cn.com/leetbook/read/dfs/euapvg/


一、104.二叉树的最大深度


1.1、题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:给定二叉树 [3,9,20,null,null,15,7],

3
  / \
9 20
  / \
  15   7

返回它的最大深度 3 。


1.2、题解思路与算法

题解思路于算法很简单,只需要简单的深度优先获取所有的叶子节点到根节点的长度,然后取出最大值即可。具体查看实现。


1.3、题解代码

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   public int maxDepth(TreeNode root) {
       if(root == null) {
           return 0;
      }
       return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1);
  }
}


二、111.二叉树的最小深度


2.1、题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

输入:root = [3,9,20,null,null,15,7]输出:2示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]输出:5

提示:

树中节点数的范围在 [0, 105] 内-1000 <= Node.val <= 1000


2.2、题解思路与算法

题解思路与104相同,只不过将最深换成最浅的思想,需要注意的是,如果节点一册为空则不会计算到所属分支中。具体查看代码实现。


2.3、题解代码

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   public int minDepth(TreeNode root) {
       if(root == null) {
           return 0;
      }
       if(root.left == null) {
           return minDepth(root.right) + 1;
      }
       if(root.right == null) {
           return minDepth(root.left) + 1;
      }
       return Math.min(minDepth(root.left) + 1, minDepth(root.right) + 1);
  }
}


三、112.路径总和


3.1、题目

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true示例 2:

输入:root = [1,2,3], targetSum = 5输出:false示例 3:

输入:root = [1,2], targetSum = 0输出:false

提示:

树中节点的数目在范围 [0, 5000] 内-1000 <= Node.val <= 1000-1000 <= targetSum <= 1000


3.2、题解思路与算法

采用树的深度遍历中的前序遍历, 由此可知每个叶子节点到根节点的长度满足题目的targetSum则为true,反之为false,具体查看代码实现。


3.3、题解代码

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   public boolean hasPathSum(TreeNode root, int targetSum) {
       if(root == null) {
           return false;
      }
       // 减去当前路径的所对应的值
       targetSum -= root.val;
       // 判断值为0并且为叶子节点,则为true
       if(targetSum == 0 && root.left == null && root.right == null) {
           return true;
      }
       // 有一条分支满足即可
       return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);
  }
}


四、226.翻转二叉树


4.1、题目

翻转一棵二叉树。

示例:

输入:

   4
  /   \
2     7
/ \   / \
1   3 6   9

输出:

 4
/   \
7     2
/ \   / \
9   6 3   1

 

4.2、题解思路与算法

本题目我是用的是广度优先,一层一层调换左右节点位置。也可以用深度优先(后序遍历)。具体查看代码实现。


4.3、题解代码

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode() {}
*     TreeNode(int val) { this.val = val; }
*     TreeNode(int val, TreeNode left, TreeNode right) {
*         this.val = val;
*         this.left = left;
*         this.right = right;
*     }
* }
*/
class Solution {
   public TreeNode invertTree(TreeNode root) {
       if(root == null) {
           return root;
      }
       Deque<TreeNode> deque = new ArrayDeque<>(Arrays.asList(root));
       while( !deque.isEmpty() ) {
           TreeNode curNode = deque.pollFirst();
           TreeNode left = curNode.left;
           TreeNode right = curNode.right;
           // invert this level
           curNode.right = left;
           curNode.left = right;
           // insert deque
           if(left != null) deque.addLast(left);
           if(right != null) deque.addLast(right);
      }
       return root;
  }
}




题目取自leetcode官网。