LeetCode-662. 二叉树最大宽度

题目来源

662. 二叉树最大宽度

题目详情

给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。

每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

示例 1:

输入:

       1
     /   \\
    3     2
   / \\     \\  
  5   3     9 

输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。

示例 2:

输入:

      1
     /  
    3    
   / \\       
  5   3     

输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。

示例 3:

输入:

      1
     / \\
    3   2 
   /        
  5      

输出: 2
解释: 最大值出现在树的第 2 层,宽度为 2 (3,2)。

示例 4:

输入:

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

输出: 8
解释: 最大值出现在树的第 4 层,宽度为 8 (6,null,null,null,null,null,null,7)。

注意: 答案在32位有符号整数的表示范围内。

题解分析

解法一:深度优先搜索

  1. 本题其实光看题目是看不出来直观的解法的,因为这里存在空节点。但是,考虑到题目中提到了一个关键信息,那就是类似于【完全二叉树】,通过这个性质可以看到解决方案的初步模型。
  2. 我们给每一个节点一个pos属性,与完全二叉树类似,该属性可以帮助标识同一层两个节点之间的间隔节点数。
  3. 此外,本题应该使用前序遍历,在继续遍历下一层之前,使用一个map来存储每一层最左边的节点序号,并且每次使用当前的pos减去map中的同一层最左pos来更新结果值。
/**
 * 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 {
    Map<Integer, Integer> left = new HashMap<>();// 存储每一层最左边的元素
    int res;
    public int widthOfBinaryTree(TreeNode root) {
        if(root == null){
            return 0;
        }
        res = 1;
        dfs(root, 0, 1);
        return res;
    }

    private void dfs(TreeNode node, int depth, int pos){
        if(node == null){
            return;
        }
        if(!left.containsKey(depth)){
            left.put(depth, pos);
        }
        res = Math.max(res, pos - left.get(depth) + 1);
        dfs(node.left, depth + 1, pos * 2);
        dfs(node.right, depth + 1, pos * 2 + 1);
    }
}

结果展示

image

posted @ 2022-02-02 15:42  Garrett_Wale  阅读(125)  评论(0编辑  收藏  举报