【LeetCode】111. 二叉树的最小深度

一、题目

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

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

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

示例:

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

    3
   / \
  9  20
    /  \
   15   7
   
返回它的最小深度  2.

二、解决

1、DFS

思路:

这里利用DFS,不断往下递归,直到遇到叶子节点,记录并更新树最小深度。这里的DFS和分治模板可以结合起来对代码进行理解。当然,最直接的可以直接看版本1,比较简单清晰。

DFS模板:

voidDFS ( Vertex V ) 
{
     
	visited[V] = true;  
	for( V 的每个邻接点W )
		if( !visited[W] )
			DFS( W );
}

分治模板:

private static int divide_conquer(Problem problem, ) {
     
  // recursion terminator 
  if (problem == NULL) {
     
    int res = process_last_result();
    return res;     
  }
  
  // prepare data 
  subProblems = split_problem(problem)
  
  // conquer subproblems 
  res0 = divide_conquer(subProblems[0])
  res1 = divide_conquer(subProblems[1])

  // process and generate the final result
  result = process_result(res0, res1);

  // revert the current level states
  
  return result;
}

代码:

版本1:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
     
    public int minDepth(TreeNode root) {
     

		// Terminator
        if(root == null) return 0;
        if(root.left==null)  return 1+minDepth(root.right);
        if(root.right==null)  return 1+minDepth(root.left);

        // divide and conquer
        int leftMinDepth = minDepth(root.left);
        int rightMinDepth = minDepth(root.right);

        // process subproblems' results
        int result = 1 + Math.min(leftMinDepth, rightMinDepth);

        return result;
    }
}

版本2:

对版本1的代码进行进一步的简化,可以得到下面代码。

class Solution {
     
    public int minDepth(TreeNode root) {
     
        
        if(root == null) return 0;
        int left = minDepth(root.left);
        int right = minDepth(root.right);
        return (left == 0 || right == 0) ? left + right + 1: Math.min(left,right) + 1;
       
    }
}

时间复杂度: O(n)
空间复杂度: O(logn)

2、BFS

思路:

从上往下进行逐层遍历,遇到叶子节点就返回层数。这里附上BFS代码模板,稍加改动,即可运用。

BFS代码模板:

public class TreeNode {
     
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
     
        val = x;
    }
}

public List<List<Integer>> levelOrder(TreeNode root) {
     
    List<List<Integer>> allResults = new ArrayList<>();
    if (root == null) {
     
        return allResults;
    }
    Queue<TreeNode> nodes = new LinkedList<>();
    nodes.add(root);
    while (!nodes.isEmpty()) {
     
        int size = nodes.size();
        List<Integer> results = new ArrayList<>();
        for (int i = 0; i < size; i++) {
     
            TreeNode node = nodes.poll();
            results.add(node.val);
            if (node.left != null) {
     
                nodes.add(node.left);
            }
            if (node.right != null) {
     
                nodes.add(node.right);
            }
        }
        allResults.add(results);
    }
    return allResults;
}

代码:

class Solution {
     
    public int minDepth(TreeNode root) {
     
        
        if(root == null) return 0;
        int depth = 1;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root);
        while(!q.isEmpty()){
     
            int size = q.size();
            // for each level
            for(int i=0; i<size; i++){
     
                TreeNode node = q.poll();
                if(node.left==null && node.right==null)  return depth;
                if(node.left != null)  q.offer(node.left);
                if(node.right != null)  q.offer(node.right);
            }
            depth++;
        }
        return depth;
    }
}

时间复杂度: O(n)
空间复杂度: O(n)

三、参考

1、My 4 Line java solution
2、Easy Solution Using BFS in JAVA
3、Very easy, with recursion, 1ms Java solution
4、3 lines in Every Language
5、二叉树的最小深度-理解递归结束条件

你可能感兴趣的:(Leetcode,二叉树,算法,dfs)