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
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP