注:\red{注:}注: 求树左右边界最优时间也是O(N),需要访问每个节点才能确定边界,推荐先序遍历。
class Solution {
public:
long long ans = 0;
vector<long long> L;
// 先序遍历
void dfs(TreeNode* now,long long v,long long l){
// 根节点为左边界
if(l >= L.size()) L.push_back(v);
ans = max(ans,v - L[l] + 1);
v -= L[l];
if(now->left != NULL) dfs(now->left,v*2,l+1);
if(now->right != NULL) dfs(now->right,v*2+1,l+1);
}
int widthOfBinaryTree(TreeNode* root) {
if(root == NULL) return 0;
dfs(root,1,0);
return ans;
}
};