首页 > 后端开发 > php教程 > 反转二叉树的奇数层

反转二叉树的奇数层

Linda Hamilton
发布: 2025-01-01 04:15:10
原创
365 人浏览过

2415。反转二叉树的奇数层

难度:中等

主题:树、深度优先搜索、广度优先搜索、二叉树

给定一个完美二叉树的根,反转树的每个奇数层的节点值。

  • 例如,假设第3层的节点值为[2,1,3,4,7,11,29,18],那么它应该变成[18,29,11,7,4,3,1 ,2].

返回反转树的根

如果所有父节点都有两个子节点并且所有叶子都位于同一级别,那么二叉树就是完美

节点的级别是它与根节点之间的路径上的边数。

示例1:

Reverse Odd Levels of Binary Tree

  • 输入: root = [2,3,5,8,13,21,34]
  • 输出: [2,5,3,8,13,21,34]
  • 说明:
    • 树只有一层奇数。
    • 第1层的节点分别是3、5,颠倒过来变成5、3。

示例2:

Reverse Odd Levels of Binary Tree

  • 输入: root = [7,13,11]
  • 输出: [7,11,13]
  • 说明:
    • 第1层的节点是13, 11,颠倒过来变成11, 13。

示例 3:

  • 输入: root = [0,1,2,0,0,0,0,1,1,1,1,2,2,2,2]
  • 输出: [0,2,1,0,0,0,0,2,2,2,2,1,1,1,1]
  • 说明:
    • 奇数级别具有非零值。
    • 第 1 层的节点为 1, 2,反转后为 2, 1。
    • 第 3 层的节点为 1, 1, 1, 1, 2, 2, 2, 2,反转后为 2, 2, 2, 2, 1, 1, 1, 1。

约束:

  • 树中的节点数量在 [1, 214] 范围内。
  • 0 5
  • 根是完美二叉树。

提示:

  1. 尝试独立递归地解决每个级别。
  2. 执行深度优先搜索时,将左右节点(应成对)传递到下一级。如果当前级别是奇数,则反转它们的值,否则递归移动到下一个级别。

解决方案:

我们需要对二叉树进行深度优先遍历。任务是反转奇数层的节点值。完美二叉树意味着所有非叶节点都有两个子节点,并且所有叶节点都处于同一级别。

我们将使用 DFS(深度优先搜索)方法,并且在每个奇数级别上,我们将反转节点值。以下是实现此目的的解决方案。

要点:

  • 这棵树是完美的,这意味着它是完全平衡的,并且所有叶节点都在同一级别。
  • 只有奇数层的节点需要反转。奇数级别从级别 1 开始索引(第 1、第 3、第 5 等)。
  • DFS可用于遍历树并识别节点的级别。当我们遇到奇数级别时,我们交换该级别的节点值。
  • 在每一层,我们遍历两个子节点:左子节点和右子节点。

方法:

  1. 对树进行深度优先遍历。
  2. 对于当前级别的每对节点:
    • 如果级别为奇数,则交换节点值。
  3. 递归处理当前节点的左右子节点,传递更新的级别信息。
  4. 处理整棵树后返回根节点。

计划:

  1. 从根节点开始。
  2. 使用递归函数 dfs 遍历树并反转奇数层的节点值。
  3. 跟踪当前级别以识别奇怪的级别。
  4. 交换奇数层的值并继续对子级进行 DFS 遍历。
  5. 处理后返回root。

解决步骤:

  1. 定义一个递归函数 dfs($left, $right, $isOddLevel):
    • left:左子节点。
    • right:右子节点。
    • isOddLevel: 布尔值,表示当前级别是否为奇数。
  2. 检查 left 是否为空。如果是,则返回,因为没有更多节点需要处理。
  3. 如果 isOddLevel 为 true,则交换左右节点的值。
  4. 递归调用 dfs 函数:
    • 左孩子的左孩子和右孩子的右孩子(下一级)。
    • 左孩子的右孩子和右孩子的左孩子(下一级)。
  5. 使用 dfs($root->left, $root->right, true) 开始递归并返回根。

让我们用 PHP 实现这个解决方案:2415。反转二叉树的奇数层

<?php
class TreeNode {
    public $val = 0;
    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 reverseOddLevels($root) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }

    /**
     * Helper function to perform DFS
     *
     * @param $left
     * @param $right
     * @param $isOddLevel
     * @return void
     */
    private function dfs($left, $right, $isOddLevel) {
       ...
       ...
       ...
       /**
        * go to ./solution.php
        */
    }
}

// Example usage:
$root = new TreeNode(2);
$root->left = new TreeNode(3);
$root->right = new TreeNode(5);
$root->left->left = new TreeNode(8);
$root->left->right = new TreeNode(13);
$root->right->left = new TreeNode(21);
$root->right->right = new TreeNode(34);

$solution = new Solution();
$reversedRoot = $solution->reverseOddLevels($root);

// Function to print the tree for testing
function printTree($root) {
    if ($root === null) {
        return;
    }
    echo $root->val . " ";
    printTree($root->left);
    printTree($root->right);
}

printTree($reversedRoot); // Output: 2 5 3 8 13 21 34
?>
登录后复制

解释:

  1. TreeNode 类:表示二叉树节点的结构,该节点有一个值(val)和两个子节点(左、右)。
  2. reverseOddLevels 函数:以根节点的左右子节点发起 DFS,并从级别 1(奇数级别)开始。
  3. dfs 函数
    • 接受两个节点(左和右)和一个布尔值 isOddLevel 来确定当前级别是否为奇数。
    • 如果当前级别为奇数,则交换 left 和 right 的值。
    • 递归地调用自身进入下一个级别,交替 isOddLevel 值(true 变为 false,反之亦然)。
  4. 递归继续处理每个级别的下一对节点,确保仅奇数级别的节点被反转。

演练示例:

示例1:

输入:

       2
      / \
     3   5
    / \ / \
   8 13 21 34
登录后复制
  • 0级:[2](偶数,无变化)。
  • 第 1 级:[3, 5](奇数,与 [5, 3] 相反)。
  • 第 2 级:[8, 13, 21, 34](偶数,无变化)。

输出:

       2
      / \
     5   3
    / \ / \
   8 13 21 34
登录后复制

示例2:

输入:

       7
      / \
     13  11
登录后复制
  • 0级:[7](偶数,无变化)。
  • 第 1 级:[13, 11](奇数,与 [11, 13] 相反)。

输出:

       7
      / \
     11  13
登录后复制

时间复杂度:

  • 时间复杂度:O(n),其中n是二叉树中的节点数。我们以深度优先的方式访问每个节点一次。
  • 空间复杂度:O(h),其中h是树的高度。递归深度对应于树的高度,在最坏的情况下(对于倾斜树),它将是 O(n),但对于完美二叉树,它是 O(log n)。

该解决方案使用时间复杂度为 O(n) 的深度优先搜索有效地反转完美二叉树奇数层的节点。该代码在奇数级别交换值并使用递归方法来处理树。

联系链接

如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

以上是反转二叉树的奇数层的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板