使用广度优先搜索获取二叉树最大宽度(JAVA)

 

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

来源:力扣(LeetCode)

 

 


思路:
本题可以使用广度优先搜索算法(BFS)将每一节点编上序号。

 

采用层序遍历将每一层宽度记录下来并比较。


答题过程中的问题:

1.Pair类:

之前没有用过这个类今天遇到简单查询应用一下。

使用场景

当我们在写一个方法需要返回两个字段值时,我之前的方法是新建一个类或使用集合。目前来看使用Pair方便很多。

配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用。

核心库对java配对的实现

Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值:

import javafx.util.Pair;
 
Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();

Pair<Integer,String> p = new Pair(1,"1");
        Integer o = p.getKey();
        String v = p.getValue();
        System.out.println("o:"+o);
        System.out.println("v:"+v);


示例描述使用Pair类实现简单Integer到String的映射。示例中getKey方法返回key对象,getValue方法返回对应值对象。


代码解析:

初始化lenght =1将根结点存入由Pair类构成的father集合中,其中前一个Key存放节点,Value存放节点对应的序号;之后进行层序遍历将father层的下一层存入son中其中节点序号设置规则为:将根节点的值设为1;则下一层的节点的值=左:(父节点*2)或者右:(父节点*2+1)之后进行计算father.get(father.size()-1).getValue()-father.get(0).getValue()+1为该层宽度,则 length=Math.max(length,father.get(father.size()-1).getValue()-father.get(0).getValue()+1);为最大宽度。

/**
 * 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 widthOfBinaryTree(TreeNode root) {
        int length=1;
//        使用Pair类用于在一个;列表位置储存树的节点于其序号
        List<Pair<TreeNode, Integer>> father =new ArrayList<Pair<TreeNode, Integer>>();
        father.add(new Pair<TreeNode, Integer>(root,1));
//        动态判断father队列是否为空
        while (!father.isEmpty()){
//            创建新的列表用于存放树的下一层
            List<Pair<TreeNode, Integer>> son=new ArrayList<Pair<TreeNode, Integer>>();
            for (Pair<TreeNode,Integer> test: father) {
//                用队列方法将新的层级储存在son中
                if (test.getKey().left!=null){
//                    将左节点为非空节点的节点于其父节点”序号“*2填加进下一层级
                    son.add(new Pair<TreeNode,Integer>(test.getKey().left,test.getValue()*2));
                }
                if (test.getKey().right!=null){
//                    将右节点为非空节点的节点于其父节点”序号“*2+1填加进下一层级
//                    最终形成类似于:
//                    1
//                    2 3
//                    4 5 6 7
//                    形式
                    son.add(new Pair<TreeNode,Integer>(test.getKey().right,test.getValue()*2+1));
                }
            }
//            判断本层于上一层宽度大小将大值赋给lenght
            length=Math.max(length,father.get(father.size()-1).getValue()-father.get(0).getValue()+1);
            father = son;
        }
        return length;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值