二叉树最大宽度(节点编号+BFS)

傷城~ 2023-10-06 13:53 41阅读 0赞

二叉树最大宽度(节点编号+BFS)

问题:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:

需对节点编号,每层最后一个节点编号-第一个节点编号+1即为该层宽度
对于满二叉树,若根的编号为x,则其左孩子编号为2x,右孩子编号为2x+1
BFS所使用的队列需保存节点指针及节点的编号

为防止数据超过表示范围,需使用unsigned long long,当队列中只有一个元素,即该层只有一个节点时,可将其编号修正为1,以减少溢出可能

代码:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. typedef unsigned long long ull;
  15. int widthOfBinaryTree(TreeNode* root) {
  16. if( root==NULL )
  17. return 0;
  18. queue< pair<TreeNode*,ull> > q;
  19. TreeNode* p=root;
  20. q.push( pair<TreeNode*,ull>(p,1) );
  21. ull ans=1;
  22. while( !q.empty() )
  23. {
  24. if( q.size()==1 )
  25. q.front().second=1;
  26. ull left=q.front().second;
  27. ull right=left;
  28. ull size=q.size();
  29. while( size-- )
  30. {
  31. p=q.front().first;
  32. right=q.front().second;
  33. q.pop();
  34. if( p->left )
  35. q.push( pair<TreeNode*,ull>( p->left,right*2 ) );
  36. if( p->right )
  37. q.push( pair<TreeNode*,ull>( p->right,right*2+1 ) );
  38. }
  39. if( right-left+1>ans )
  40. ans=right-left+1;
  41. }
  42. return ans;
  43. }
  44. };

发表评论

表情:
评论列表 (有 0 条评论,41人围观)

还没有评论,来说两句吧...

相关阅读