C++ 中二叉树的最大宽度
c++server side programmingprogramming
假设我们有一棵二叉树,我们需要定义一个函数来获取给定树的最大宽度。这里,树的宽度是所有层级中的最大宽度。我们假设该二叉树具有与满二叉树相同的结构,但某些节点为空。一层级的宽度实际上是两端节点(即该层级中最左边和最右边的非空节点,其中两端节点之间的空节点也计入长度计算)之间的长度。因此,如果树的形式为 −
由于最后一层的节点为 [5,3,null,9],因此最大宽度为 4
为了解决这个问题,我们将遵循以下步骤 −
ans := 1, size := 0
定义一个双端队列 q,用于存储 (node, value) 对。
将 (root, 1) 插入 q
当 q 不为空时
size := q 的大小
定义一个 (节点, 值) 对 curr
如果 size 为 1,则将 (最前面元素的节点, 1) 插入 q,并从 q 中删除元素
当 size 不为 0 时
curr := q 的最前面元素,从 q 中删除最前面元素
如果 curr 节点的 left 不为空,则
创建 (当前节点的 left,2*curr 的值) 并将其插入 q
如果 curr 节点的 right 不为空,则
创建 (当前节点的 right,2*curr 的值 + 1) 并插入 q
如果 q 的大小 > 1,则
ans := ans 的最大值,q 中最后一个元素的值 – q 中第一个元素的值 + 1
size := size – 1
return 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