2641. 이진나무의 사촌 II
난이도:중
주제: 해시 테이블, 트리, 깊이 우선 검색, 너비 우선 검색, 이진 트리
이진 트리의 루트가 주어지면 트리의 각 노드 값을 모든 사촌 값의 합으로 바꿉니다.
이진 트리의 두 노드는 서로 다른 부모와 동일한 깊이를 갖는 경우 사촌입니다.
수정된 트리의 루트를 반환합니다.
참고 노드의 깊이는 루트 노드에서 해당 노드까지의 경로에 있는 가장자리의 수입니다.
예 1:
예 2:
제약조건:
힌트:
해결책:
이 솔루션은 깊이 우선 검색(DFS) 접근 방식을 두 번 사용합니다.
이 솔루션을 PHP로 구현해 보겠습니다: 2641. 이진나무의 사촌 II
<?php // Definition for a binary tree node. class TreeNode { public $val = null; public $left = null; public $right = null; public function __construct($val = 0, $left = null, $right = null) { $this->val = $val; $this->left = $left; $this->right = $right; } } class Solution { /** * @param TreeNode $root * @return TreeNode */ public function replaceValueInTree($root) { ... ... ... /** * go to ./solution.php */ } /** * DFS to calculate the sum of node values at each level. * @param $root - current node * @param $level - current depth level in the tree * @param $levelSums - array holding the sum of values at each level * @return void */ private function dfs($root, $level, &$levelSums) { ... ... ... /** * go to ./solution.php */ } /** * DFS to replace the node values with the sum of cousins' values. * @param $root - current node in the original tree * @param $level - current depth level in the tree * @param $curr - node being modified in the new tree * @param $levelSums - array holding the sum of values at each level * @return mixed */ private function replace($root, $level, $curr, $levelSums) { ... ... ... /** * go to ./solution.php */ } } // Helper function to print the tree (for testing purpose) function printTree($root) { if ($root === null) return []; $result = []; $queue = [$root]; while (!empty($queue)) { $node = array_shift($queue); if ($node !== null) { $result[] = $node->val; $queue[] = $node->left; $queue[] = $node->right; } else { $result[] = null; } } // Remove trailing null values for clean output while (end($result) === null) { array_pop($result); } return $result; } // Example usage: // Tree: [5,4,9,1,10,null,7] $root = new TreeNode(5); $root->left = new TreeNode(4); $root->right = new TreeNode(9); $root->left->left = new TreeNode(1); $root->left->right = new TreeNode(10); $root->right->right = new TreeNode(7); $solution = new Solution(); $modifiedTree = $solution->replaceValueInTree($root); print_r(printTree($modifiedTree)); // Output: [0, 0, 0, 7, 7, null, 11] ?> <h3> 코드 분석 </h3> <h4> 1.replaceValueInTree 메소드 </h4> <ul> <li>프로세스를 초기화하는 주요 메소드입니다.</li> <li>각 수준의 값 합계를 보관하기 위해 빈 배열 $levelSums를 생성합니다.</li> <li>첫 번째 DFS를 호출하여 $levelSums를 채운 다음 두 번째 DFS를 호출하여 트리의 값을 바꿉니다.</li> </ul> <h4> 2. dfs 방법(첫 번째 DFS) </h4> <ul> <li> <p><strong>매개변수:</strong></p> <ul> <li> $root: 현재 노드.</li> <li> $level: 트리의 현재 깊이 수준.</li> <li> &$levelSums: 합계가 저장될 배열에 대한 참조입니다.</li> </ul> </li> <li><p><strong>기본 사례:</strong> 노드가 null인 경우 반환합니다.</p></li> <li><p>현재 레벨의 합계가 초기화되지 않은 경우(즉, 해당 레벨이 배열에 존재하지 않는 경우) 0으로 초기화하세요.</p></li> <li><p>현재 노드의 값을 해당 레벨의 합계에 더합니다.</p></li> <li><p>왼쪽 및 오른쪽 하위 항목에 대해 반복적으로 dfs를 호출하여 레벨을 1씩 증가시킵니다.</p></li> </ul> <h4> 3. 교체 방법(두 번째 DFS) </h4> <ul> <li> <p><strong>매개변수:</strong></p> <ul> <li> $root: 현재 노드.</li> <li> $level: 현재 깊이 수준.</li> <li> $curr: 수정된 트리의 현재 노드.</li> <li> $levelSums: 각 레벨의 합계가 포함된 배열입니다.</li> </ul> </li> <li> <p>사촌의 가치 합계 계산:</p> <ul> <li>다음 레벨의 총합을 구하세요.</li> <li>이 합계에서 현재 노드의 하위(형제) 값을 빼서 사촌의 합계를 구합니다.</li> </ul> </li> <li><p>왼쪽 하위가 존재하는 경우 사촌의 합으로 새 TreeNode를 생성하고 이에 대해 재귀적으로 바꾸기를 호출합니다.</p></li> <li><p>맞는 아이가 있다면, 맞는 아이에게도 똑같이 해주세요.</p></li> </ul> <h3> 예제 연습 </h3> <p>프롬프트의 첫 번째 예를 사용해 보겠습니다.</p> <h4> 입력 </h4> <pre class="brush:php;toolbar:false">root = [5,4,9,1,10,null,7]
첫 번째 DFS(레벨 합계 계산):
두 번째 DFS(값 바꾸기):
<?php // Definition for a binary tree node. class TreeNode { public $val = null; public $left = null; public $right = null; public function __construct($val = 0, $left = null, $right = null) { $this->val = $val; $this->left = $left; $this->right = $right; } } class Solution { /** * @param TreeNode $root * @return TreeNode */ public function replaceValueInTree($root) { ... ... ... /** * go to ./solution.php */ } /** * DFS to calculate the sum of node values at each level. * @param $root - current node * @param $level - current depth level in the tree * @param $levelSums - array holding the sum of values at each level * @return void */ private function dfs($root, $level, &$levelSums) { ... ... ... /** * go to ./solution.php */ } /** * DFS to replace the node values with the sum of cousins' values. * @param $root - current node in the original tree * @param $level - current depth level in the tree * @param $curr - node being modified in the new tree * @param $levelSums - array holding the sum of values at each level * @return mixed */ private function replace($root, $level, $curr, $levelSums) { ... ... ... /** * go to ./solution.php */ } } // Helper function to print the tree (for testing purpose) function printTree($root) { if ($root === null) return []; $result = []; $queue = [$root]; while (!empty($queue)) { $node = array_shift($queue); if ($node !== null) { $result[] = $node->val; $queue[] = $node->left; $queue[] = $node->right; } else { $result[] = null; } } // Remove trailing null values for clean output while (end($result) === null) { array_pop($result); } return $result; } // Example usage: // Tree: [5,4,9,1,10,null,7] $root = new TreeNode(5); $root->left = new TreeNode(4); $root->right = new TreeNode(9); $root->left->left = new TreeNode(1); $root->left->right = new TreeNode(10); $root->right->right = new TreeNode(7); $solution = new Solution(); $modifiedTree = $solution->replaceValueInTree($root); print_r(printTree($modifiedTree)); // Output: [0, 0, 0, 7, 7, null, 11] ?>
사촌 값을 기반으로 한 이 단계별 교체로 인해 예와 같이 수정된 트리가 생성됩니다.
연락처 링크
이 시리즈가 도움이 되었다면 GitHub에서 저장소에 별표를 표시하거나 즐겨찾는 소셜 네트워크에서 게시물을 공유해 보세요. 여러분의 지원은 저에게 큰 의미가 될 것입니다!
이런 유용한 콘텐츠를 더 원하시면 저를 팔로우해주세요.
위 내용은 이진 트리 II의 사촌의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!