이진 트리가 있다고 가정하고 주어진 트리의 최대 너비를 가져오는 함수를 정의해야 합니다. 여기서 트리의 너비는 모든 레벨 중 최대 너비입니다. 이진 트리는 전체 이진 트리와 동일한 구조를 갖지만 일부 노드는 null인 것으로 간주합니다. 한 수준의 너비는 실제로 끝 노드 사이의 길이입니다(수준에서 가장 왼쪽 및 가장 오른쪽의 null이 아닌 노드, 끝 노드 사이의 null 노드도 길이 계산에 포함됨). 트리가 다음과 같다면 -
마지막 레이어의 노드가 [5,3,null,9]
이므로 최대 너비는 4입니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
답변 :=1, 크기 :=0
-
(노드, 값) 쌍을 저장할 이중 종료 대기열 q를 정의합니다.
-
q에 (루트, 1) 삽입
-
q가 비어 있지 않은 동안
-
size :=q의 크기
-
(노드, 값) 쌍 curr 정의
-
크기가 1이면 (앞 요소의 노드, 1) q로, q에서 요소 삭제
-
크기가 0이 아닌 동안
-
curr :=q의 앞 요소, q에서 앞 요소 삭제
-
curr 노드의 왼쪽이 null이 아니면
-
생성(현재 노드의 왼쪽, 2*curr의 값) 및 q
에 삽입
-
-
curr 노드의 오른쪽이 null이 아니면
-
생성(현재 노드의 오른쪽, 2*curr의 값 + 1) 및 q
에 삽입
-
-
크기가 q> 1이면
-
ans :=ans의 최대값, q의 마지막 요소 값 – q의 첫 번째 요소 값 + 1
-
-
크기 :=크기 – 1
-
-
-
반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#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