• [Leetcode]662.Maximum Width of Binary Tree


    链接:LeetCode662

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

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

    相关标签:

    这道题实际上是求每层节点最左边与右边的距离。这道题关键点在于,我们需要知道,对于一颗满二叉树,节点(n)的左右节点分别是(2n)((2n+1))。知道这点后,我们利用一个队列,通过求层遍历的方式即可得每一层宽度。

    代码如下:

    python:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def widthOfBinaryTree(self, root: TreeNode) -> int:
            res = 0
            if not root:
                return res
            queue = collections.deque()
            queue.append([root,1])
            while queue:
                left_ind = queue[0][-1]
                for _ in range(len(queue)):
                    q,ind = queue.popleft()
                    if q.left:
                        queue.append([q.left,ind*2])
                    if q.right:
                        queue.append([q.right,ind*2+1])
                res = max(res,ind-left_ind+1)
            return res
    

    C++:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int widthOfBinaryTree(TreeNode* root) {
            int res = 0;
            if(!root) return res;
            queue<pair<TreeNode*,double>> q;
            q.push({root,1});
            while(!q.empty()){
                double left = q.front().second,right=0,n = q.size();
                for(int i=0;i<n;++i){
                    TreeNode* treeNode = q.front().first;
                    right = q.front().second;
                    q.pop();
                    if(treeNode->left) q.push({treeNode->left,right*2});
                    if(treeNode->right) q.push({treeNode->right,right*2+1});
                }
                res = max(res,(int)(right-left+1));
            }
            return res;
        }
    };
    
  • 相关阅读:
    C++中的函数名称粉碎机制和它的逆向应用
    C++中const关键字的功能总结
    探究printf函数对单精度浮点数的处理
    利用共用体和位段获得IEEE标准编码的浮点型数据各部分数值
    C++中使用switch..case语句的易出错陷阱和规避方法
    浮点型数据(float, double)存储IEEE标准解析和应用
    React实用技巧
    Web前端之iframe详解
    开源的api文档管理系统
    编写自己的代码库(css3常用动画的实现)
  • 原文地址:https://www.cnblogs.com/hellojamest/p/12245765.html
Copyright © 2020-2023  润新知