算法挑战48: 反转等价二叉树

5 阅读1分钟

题目

我们可以为二叉树 T 定义一个 翻转操作 ,如下所示:选择任意节点,然后交换它的左子树和右子树。

只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转 等价 于二叉树 Y

这些树由根节点 root1 和 root2 给出。如果两个二叉树是否是翻转 等价 的树,则返回 true ,否则返回 false 。

思路

跟相同二叉树类似

每个节点要做的就是判断当前节点是否相等,

还有子树是否可以通过反转实现相等, 怎么说呢

就是左右子树可以不对应,反转之后对应也行

代码

var flipEquiv = function (root1, root2) {
    //每个节点的左右节点
    if (!root1 && !root2) return true;
    if (!root1 || !root2) return false;
    function dfs(p, q) {
        if (!p && !q) return true;
        if (!p || !q) return false;
        if(p.val !== q.val) return false;

        return dfs(p.left,q.left) && dfs(p.right,q.right) || dfs(p.left,q.right) && dfs(p.right,q.left);
    }

    return dfs(root1,root2);
};