列表

详情


NC204. 二叉树的最大宽度

描述

给定一个二叉树,请你求出此二叉树的最大宽度。

本题中树第 i 层的宽度定义为:第 i 层最左边的节点到最右边之间的距离,中间空节点也计入距离。

例如:

本树中第 1 层只有一个节点,故第 1 层宽度是 1 ,第二层最左侧到最右侧的距离是 2 ,所以宽度是 2 , 第三层最左侧 4 到最右侧 5 距离是 4 ,故宽度是 4,此树最大宽度是 4。

示例1

输入:

{1,2,3,4,#,4,5}

输出:

4

说明:

如题面图

示例2

输入:

{1}

输出:

1

示例3

输入:

{1,2,3,4,#,4,5,6,#,1}

输出:

5

说明:

最后一层的宽度为5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Go 解法, 执行用时: 2ms, 内存消耗: 784KB, 提交时间: 2022-02-09

package main
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型
*/
func widthOfBinaryTree( root *TreeNode ) int {
    if root==nil{
        return 0
    }
    q:=make([]*TreeNode,0)
    q=append(q, root)
    l:=0
    ans:=1
    for len(q)>0{
        l=len(q)
        for i:=0;i<l;i++{
            if q[i]!=nil{
                q = append(q,q[i].Left )
                q = append(q,q[i].Right )
            }else{
                q = append(q,nil )
                q = append(q,nil )
            }
        }
        q=q[l:]
        i,j:=0,len(q)-1
        for i<len(q)&&j>=0&&(q[i]==nil||q[j]==nil){
            if q[i]==nil{
                i++
            }
            if q[j]==nil{
                j--
            }
        }
        if i>j{
            break
        }
        q=q[i:j+1]
        l=len(q)
        ans=max(ans,l)
    }
    return ans 
}

func max(a,b int)int{
    if a>b{
        return a 
    }
    return b 
}

C++ 解法, 执行用时: 3ms, 内存消耗: 300KB, 提交时间: 2021-12-19

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */

struct Node {
    int minv;
    int maxv;
    Node() {};
    Node(int m1, int m2) : minv(m1), maxv(m2) {};
};

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int widthOfBinaryTree(TreeNode* root) {
        // write code here
        if(root == NULL) {
            return 0;
        }
        helper(root, 0, 0);
        int maxd = 0;
        for(auto iter = mp.begin(); iter != mp.end(); iter++) {
            maxd = max(maxd, iter->second.maxv - iter->second.minv + 1);
        }
        return maxd;
    }
private:
    void helper(TreeNode* nd, int depth, int seq) {
        if(nd == NULL) {
            return;
        }
        add(depth, seq);
        helper(nd->left, depth+1, 2*seq);
        helper(nd->right, depth+1, 2*seq+1);
    }
private:
    void add(int depth, int seq) {
        auto iter = mp.find(depth);
        if(iter == mp.end()) {
            mp[depth] = Node(seq, seq);
        } else {
            if(iter->second.minv > seq) {
                iter->second.minv = seq;
            } 
            if(iter->second.maxv < seq) {
                iter->second.maxv = seq;
            }
        }
    }
private:
    map<int, Node> mp;
};

C++ 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2022-05-16

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int widthOfBinaryTree(TreeNode* root) {
        if(!root) return 0;
        int ans = 1;
        queue<pair<TreeNode*, int> > q;
        q.push({root, 1});
        while(q.size())
        {
            int length = q.size();
            int l = INT32_MAX, r = 0;
            while(length--)
            {
                auto temp = q.front();
                q.pop();
                l = min(temp.second, l);
                r = max(r, temp.second);
                if(temp.first->left) q.push({temp.first->left, temp.second * 2});
                if(temp.first->right) q.push({temp.first->right, temp.second * 2 + 1});
            }
            ans = max(ans, r - l + 1);
        }
        return ans;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-04-20

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int widthOfBinaryTree(TreeNode* root) {
        // write code here
        if (!root) {
            return 0;
        }
        
        queue<TreeNode*> q;
        q.push(root);
        int ans = INT_MIN;
        
        while (!q.empty()) {
            ans = max(ans, q.back()->val - q.front()->val + 1);
            int sz = q.size();
            int offset = q.front()->val;
            
            while (sz-- > 0) {
                root = q.front();
                q.pop();
                
                int val = root->val - offset;
                if (root->left) {
                    root->left->val = 2 * val + 1;
                    q.push(root->left);
                }
                if (root->right) {
                    root->right->val = 2 * val + 2;
                    q.push(root->right);
                }
            }
        }
        
        return ans;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-03-29

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    int widthOfBinaryTree(TreeNode* root) {
        // write code here
         if(root == nullptr){
             return 0;
         }
         if(!(root->left && root->right)){
             return 1;
         }
        int Size = 0;
        queue<pair<TreeNode*,int>> q;
        q.push({root,1});
        int res = INT_MIN;
        while(!q.empty()){
            Size = q.size();
            int max1 = INT_MIN, min1 = INT_MAX;
            for(int i = 0; i< Size ;i++){
                auto node = q.front();
                q.pop();
                if(node.first->left){
                    q.push({node.first->left, node.second * 2});
                    max1 = max(max1, node.second * 2);
                    min1 = min(min1, node.second * 2);
                }
                if(node.first->right){
                    q.push({node.first->right, node.second * 2+1});
                    max1 = max(max1, node.second * 2 +1);
                    min1 = min(min1, node.second * 2 +1);
                }
            }
            res = max(res, max1-min1 +1);
        }
        return res;
    }
};

上一题