题目描述:
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(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);
}
};