C++ 中二叉树的最大宽度
假设我们有一个二叉树,我们需要定义一个函数来获取给定树的最大宽度。这里树的宽度是指所有层中最大的宽度。我们将认为二叉树具有与完全二叉树相同的结构,但某些节点为空。某一层的宽度实际上是端节点之间的长度(该层中最左边和最右边的非空节点,其中端节点之间的空节点也计入长度计算)。因此,如果树如下所示:
那么最大宽度为 4,因为最后一层的节点为 [5,3,null,9]
为了解决这个问题,我们将遵循以下步骤:
ans := 1,size := 0
定义一个双端队列 q,我们将存储 (节点,值) 对。
将 (根节点,1) 插入 q
当 q 不为空时
size := q 的大小
定义一个 (节点,值) 对 curr
如果 size 为 1,则将 (队列首元素的节点,1) 插入 q,删除 q 中的元素
当 size 不为 0 时
curr := q 的首元素,删除 q 中的首元素
如果 curr 节点的左子节点不为空,则
创建 (当前节点的左子节点,curr 的值的 2 倍) 并插入 q
如果 curr 节点的右子节点不为空,则
创建 (当前节点的右子节点,curr 的值的 2 倍 + 1) 并插入 q
如果 q 的大小 > 1,则
ans := ans,q 中最后一个元素的值 – q 中第一个元素的值 + 1 的最大值
size := size – 1
返回 ans
让我们看看以下实现以更好地理解:
示例
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: int widthOfBinaryTree(TreeNode* root) { int ans = 0; deque < pair <TreeNode*, int> > q; q.push_back({root,1}); ans = 1; int size; while(!q.empty()){ size = q.size(); pair <TreeNode*, int> curr; if(size == 1){ q.push_back({q.front().first, 1}); q.pop_front(); } while(size--){ curr = q.front(); q.pop_front(); if(curr.first->left){ q.push_back({curr.first->left, 2 * curr.second}); } if(curr.first->right){ q.push_back({curr.first->right, 2 * curr.second + 1}); } } if(q.size() > 1) ans = max(ans, q.back().second - q.front().second + 1); } return ans; } }; main(){ vector<int> v = {1,3,2,5,3,NULL,9}; TreeNode *root = make_tree(v); Solution ob; cout << (ob.widthOfBinaryTree(root)); }
输入
[1,3,2,5,3,null,9]
输出
4
广告