leetcode 662——二叉树的最大宽度

题目描述:
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例 1:
在这里插入图片描述
示例 3:
在这里插入图片描述
解题思路:
如果是求树中每一层非空节点的最大宽度那么很简单,但这里要算上中间的空节点,因此不能用层序遍历来求,具体解题思路如下:
  假设满二叉树表示成数组序列, 根节点所在的位置为1, 则任意位于i节点的左右子节点的index为2*i和2*i+1。用一个vector保存每层的左端点, 易知二叉树有多少层vector的元素就有多少个. 那么可以在dfs的过程中记录每个节点的index及其所在的层level, 如果level > vector.size()说明当前节点就是新的一层的最左节点,将其加入vector中,否则当前节点就不是某一层的最左节点,我们应该判断当前节点的index减去vector中对应层的最左节点的index的宽度是否大于最大宽度并更新

代码实现:

class Solution {
public:
    unsigned int maxWidth = 0;
    
    int widthOfBinaryTree(TreeNode* root) {
        vector<unsigned int> left;
        dfs(root, 1, 1, left);
        return maxWidth;
    }

private:
    void dfs(TreeNode* root, unsigned int level, unsigned int index, vector<unsigned int>& left)
    {
        if (root == nullptr)
            return;
        
        if (level > left.size())    //这里压入的一定是最左的非空节点
            left.push_back(index);
        
        maxWidth = max(maxWidth, index - left[level-1] + 1);
        
        dfs(root->left, level+1, index*2, left);
        dfs(root->right, level+1, index*2+1, left);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值