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
廣告