LeetCode每日一题:662二叉树最大宽度

Posted 遨游java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode每日一题:662二叉树最大宽度相关的知识,希望对你有一定的参考价值。

题目描述:

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

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

解题原理:

  宽度优先遍历每个节点,纪录每个节点的位置信息。比如当前节点位置是n  那么它的左孩子位置就是2*n 它的右孩子就是2*n+1

  该层的节点个数就是:该层的最右节点位置-该层的最右节点位置+1  最右节点指的是该层最右的非空节点。

  由于空的节点也有可能算,所以空节点也要封装成信息加入队列。

class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        Queue<Info> queue = new LinkedList<>();
        queue.add(new Info(root,1,1));
        int left = 1;
        int max = 0;
        int level = 1;
        while(!queue.isEmpty()){
            Info curNodeInfo = queue.poll();
            TreeNode curNode = curNodeInfo.node;
            int position = curNodeInfo.position;
            int curLevel = curNodeInfo.level;
            if(curNodeInfo.node!=null){
                queue.add(new Info(curNode.left,2*position,curLevel+1));
                queue.add(new Info(curNode.right,2*position+1,curLevel+1));
                if(level!=curLevel){
            // 说明进入了下一层,所以当前节点位置就是最左位置。纪录一下 level
= curLevel; left = position; }
          // 每次都拿 当前节点位置-最左节点位置+1 并更新,总会遍历到最右的非空节点。 max
= Math.max(max,position-left+1); } } return max; } // 纪录节点信息:节点、位置、该节点所在层数 static class Info{ TreeNode node; int position; int level; public Info(TreeNode node,int position,int level){ this.node = node; this.position = position; this.level = level; } } }

 

延伸题目:

  求二叉树最大宽度,不包含空节点

解题原理:

  准备一个HashMap<节点,层数>

  准备两个变量:curLevel(当前层数) nodes(当前层数的节点数) 进队列时候,向HashMap中put(节点,当前节点层数)

  出队列时候,在HashMap中查询该节点层数,并nodes++ 当层数变大时,nodes重置

public int maxWidth(TreeNode root) {
        HashMap<TreeNode,Integer> map = new HashMap<>();
        map.put(root,1);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int level = 1;
        int nodeCount = 0;
        int max = 0;
        while(!queue.isEmpty()){
            TreeNode curNode = queue.poll();
            int curLevel = map.get(curNode);
            if(curLevel==level){
                nodeCount++;
            }else {
                max = Math.max(nodeCount,max);
                level = curLevel;
                nodeCount = 1;
            }
            if(curNode.left!=null){
                queue.add(curNode.left);
                if(!map.containsKey(curNode.left)){
                    map.put(curNode.left,curLevel+1);
                }
            }
            if(curNode.right!=null){
                queue.add(curNode.right);
                if(!map.containsKey(curNode.right)){
                    map.put(curNode.right,curLevel+1);
                }
            }

        }
        max = Math.max(max,nodeCount);
        return max;
    }

 

以上是关于LeetCode每日一题:662二叉树最大宽度的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode662 二叉树最大宽度

Leetcode刷题100天—662. 二叉树最大宽度(二叉树)—day09

LeetCode Java刷题笔记—662. 二叉树最大宽度

我用java刷 leetcode 662. 二叉树最大宽度

LeetCode 662. 二叉树最大宽度

662二叉树最大宽度