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] ?>
參數:
基本情況:如果節點為空,則回傳。
如果目前層級的總和未初始化(即該層級在陣列中不存在),則將其初始化為 0。
將目前節點的值加到其等級的總和。
對左右子節點遞歸呼叫 dfs,層級加 1。
參數:
計算表兄弟的值的總和:
如果左子節點存在,則使用表格兄弟的總和建立新的 TreeNode,並遞歸呼叫取代它。
如果右孩子存在,則對右孩子做同樣的事情。
讓我們使用提示中的第一個範例:
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中文網其他相關文章!