【问题标题】:Techniques used in checking if a binary tree is symmetric用于检查二叉树是否对称的技术
【发布时间】:2019-11-05 04:02:14
【问题描述】:

给定一棵二叉树,检查它是否是自身的镜像(即,围绕其中心对称)。 问题链接是here

recursion method 需要遍历树两次。

但其中一条评论提供了一种解决方案,该解决方案使用了一种称为“空检查”的技术。我不明白为什么这样我们可以避免两次检查树?

这是他的 C++ 代码:

bool isSymmetric(TreeNode* root) {
        if (!root) return true;
        return isSymmetric(root->left, root->right);
    }

    bool isSymmetric(TreeNode* t1, TreeNode* t2){
        if (!t1 && !t2) return true;
        if (!t1 || !t2) return false;
        return t1->val == t2->val
            && isSymmetric(t1->left, t2->right)
            && isSymmetric(t1->right, t2->left);
    }

我也试过修改成python3,我的代码也通过了所有的测试用例!

这是我的代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def isSymmetric(self, root):
        return self.helper(root)
    def helper(self,root):
        if root is None:
            return True

        #why we can redefine the helper here?
        def helper(left,right):
            if left is None and right is None:
                return True
            if left is None or right is None:
                return False
            return left.val==right.val and helper(left.left,right.right) and helper(left.right,right.left)

        return helper(root.left,root.right)

我以前从未遇到过这种递归。

(1) 为什么我们可以在辅助函数本身中用不同的参数重新定义函数辅助函数?

(2) 我的直觉告诉我,辅助函数一旦返回根节点就会停止执行,因此不会对树进行两次检查。但我不知道为什么。

【问题讨论】:

  • 第二个helperclass Solution的方法helper中的一个局部函数。我知道本地功能,例如来自帕斯卡。在 C++ 中,不允许使用本地函数。 (但使用 lambdas 可以实现类似的效果。)
  • 只是不要将这两个函数称为相同的,大部分混淆都会消失。

标签: python c++ algorithm data-structures binary-tree


【解决方案1】:

def 语句实际上只是一个花哨的赋值语句。在Solution.helper 中,您正在定义一个名为helper 的局部变量,该变量绑定到另一个函数。因此,Solution.helper 内的所有引用以及对名称 helper 的本地函数都会解析为本地函数。

Solution.helper 不是递归函数;只有局部函数是。您可以编写与

相同的内容(不那么容易混淆但等效)
class Solution:
    def isSymmetric(self, root):
        return self.helper(root)
    def helper(self,root):
        if root is None:
            return True

        def helper2(left,right):
            if left is None and right is None:
                return True
            if left is None or right is None:
                return False
            return left.val==right.val and helper2(left.left,right.right) and helper2(left.right,right.left)

        return helper2(root.left,root.right)

【讨论】:

  • 感谢您的回答。我的pythonhelp函数还是需要遍历树两次。
【解决方案2】:

函数isSymmetric(TreeNode* root 的作用非常简单。首先,如果树为空,则返回true,如果不是,则检查其左孩子是否是其右孩子的镜像,这发生在isSymmetric(TreeNode* t1, TreeNode* t2) 中。所以让我们试着理解第二个函数是如何工作的。它本质上是设计用来取两棵树并检查它们是否是彼此的镜像。如何?首先,它会进行明显的检查。如果一个是null 而另一个不是,则返回false,如果两者都是null,则返回true。有趣的部分发生在两者都可能是树时。一个人的左孩子是另一个人的右孩子的镜子就足够了,反之亦然。你可以画一棵树来看看为什么会这样。模式应该是不言自明的。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2015-04-23
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多