首页  >  文章  >  后端开发  >  。翻转等效二叉树

。翻转等效二叉树

Linda Hamilton
Linda Hamilton原创
2024-10-25 12:01:02337浏览

951。翻转等效二叉树

难度:中等

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

对于二叉树T,我们可以定义一个翻转操作,如下:选择任意节点,交换左右子树。

二叉树X翻转等价于二叉树Y当且仅当我们可以使X等于Y 经过一定次数的翻转操作。

给定两个二叉树 root1 和 root2 的根,如果两棵树翻转等价,则返回 true,否则返回 false.

示例1:

. Flip Equivalent Binary Trees

  • 输入: root1 = [1,2,3,4,5,6,null,null,null,7,8], root2 = [1,3,2,null,6,4,5 ,空,空,空,空,8,7]
  • 输出: true
  • 解释:我们翻转值为 1、3 和 5 的节点。

示例2:

  • 输入: root1 = [], root2 = []
  • 输出: true

示例 3:

  • 输入: root1 = [], root2 = [1]
  • 输出: false

约束:

  • 每棵树的节点数在 [0, 100] 范围内。
  • 每棵树都有唯一的节点值,范围为 [0, 99]。

解决方案:

我们可以使用递归深度优先搜索(DFS)。这个想法是,如果两棵树的根值相同,并且子树相同(没有任何翻转),或者在某些节点翻转左右子树后它们变得相同,则它们是翻转等价的。

计划:

  1. 基本案例:

    • 如果 root1 和 root2 都为空,则它们是简单翻转等价的。
    • 如果其中只有一个为空,则它们不能等价。
    • 如果root1和root2的根值不同,则它们不能相等。
  2. 递归案例:

    • 递归检查两种可能性:
      1. root1 的左子树翻转相当于 root2 的左子树,root1 的右子树翻转相当于 root2 的右子树(即不翻转)。
      2. root1 的左子树翻转相当于 root2 的右子树,root1 的右子树翻转相当于 root2 的左子树(即翻转孩子)。

让我们用 PHP 实现这个解决方案:951。翻转等效二叉树

<?php
// Definition for a binary tree node.
class TreeNode {
    public $val;
    public $left;
    public $right;
    function __construct($val = 0, $left = null, $right = null) {
        $this->val = $val;
        $this->left = $left;
        $this->right = $right;
    }
}

/**
 * @param TreeNode $root1
 * @param TreeNode $root2
 * @return Boolean
 */
function flipEquiv($root1, $root2) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Example usage:
$root1 = new TreeNode(1,
    new TreeNode(2, new TreeNode(4), new TreeNode(5, new TreeNode(7), new TreeNode(8))),
    new TreeNode(3, new TreeNode(6), null)
);

$root2 = new TreeNode(1,
    new TreeNode(3, null, new TreeNode(6)),
    new TreeNode(2, new TreeNode(4), new TreeNode(5, new TreeNode(8), new TreeNode(7)))
);

var_dump(flipEquiv($root1, $root2)); // Output: bool(true)
?>

解释:

  1. TreeNode 类:TreeNode 类表示二叉树中的节点,具有构造函数来初始化节点的值、左子节点和右子节点。

  2. flipEquiv 函数:

    • 基本情况处理两个节点都为空、一个节点为空或值不匹配的情况。
    • 递归情况检查两种可能性(不翻转与翻转),确保子树在任一条件下翻转等效。

时间复杂度:

  • 该函数检查两棵树中的每个节点,并且每个递归调用处理两个子树。因此,时间复杂度为 O(N),其中 N 是树中的节点数。

空间复杂度:

  • 由于递归堆栈,空间复杂度为 O(H),其中 H 是树的高度。在最坏的情况下(对于倾斜的树),这可能是 O(N)。

联系链接

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

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

  • 领英
  • GitHub

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn