【算法】求二叉树最大宽度

通过层次遍历的思想求

public class TreeMaxWidth {
    //方法一
    public int getMaxWidth1(Node head) {
        if (head == null) {
            return 0;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.add(head);
        //HashMap保存节点和节点所在层数
        HashMap<Node, Integer> levelMap = new HashMap<>();
        levelMap.put(head, 1);
        int curLevel = 1; //当前是哪一层
        int curLevelNodes = 0; //当前层的节点数
        int maxWidth = Integer.MIN_VALUE; //最大宽度
        //层次遍历的思想
        while (!queue.isEmpty()) {
            Node cur = queue.poll();
            int curNodeLevel = levelMap.get(cur); //获得遍历节点所在层数
            if (curNodeLevel == curLevel) { //如果和当前层一样,层节点数加一
                curLevelNodes++;
            } else { //如果不一样,即表示遍历到了下一层,更新最大宽度并重新计算层节点数目
                maxWidth = Math.max(maxWidth, curLevelNodes);
                curLevel++;
                curLevelNodes = 1;
            }
            if (cur.left != null) {
                queue.add(cur.left);
                levelMap.put(cur.left, curNodeLevel + 1);
            }
            if (cur.right != null) {
                queue.add(cur.right);
                levelMap.put(cur.right, curNodeLevel + 1);
            }
        }
        return Math.max(maxWidth, curLevelNodes);
    }
    
    //方法二
    public static int getMaxWidth2(Node head) {
        if (head == null) {
            return 0;
        }
        Queue<Node> queue = new LinkedList<>();
        int maxWidth = Integer.MIN_VALUE; //最大宽度
        int curLevelNodes = 0; //当前层的节点数
        Node curEndNode = head; //当前层的最后一个节点
        Node nextEndNode = null; //下一层的最后一个节点
        //层次遍历的思想
        queue.add(head);
        while (!queue.isEmpty()) {
            head = queue.poll();
            curLevelNodes++; //当前层节点数加一
            //每次有节点入队,都把那个节点赋给nextEndNode,
            // 当前遍历节点为当前层的最后一个节点时,nextEndNode即为下一层的最后一个节点
            if (head.left != null) {
                queue.add(head.left);
                nextEndNode = head.left;
            }
            if (head.right != null) {
                queue.add(head.right);
                nextEndNode = head.right;
            }
            if (head == curEndNode) { //遍历节点为当前层的最后一个节点
                maxWidth = Math.max(maxWidth, curLevelNodes); //更新宽度
                curEndNode = nextEndNode; //更新当前层最后一个节点
                curLevelNodes = 0; //当前层节点数归零,待重新计算
            }
        }
        return maxWidth;
    }
}
posted @   hzyuan  阅读(192)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示