【发布时间】: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) 我的直觉告诉我,辅助函数一旦返回根节点就会停止执行,因此不会对树进行两次检查。但我不知道为什么。
【问题讨论】:
-
第二个
helper是class Solution的方法helper中的一个局部函数。我知道本地功能,例如来自帕斯卡。在 C++ 中,不允许使用本地函数。 (但使用 lambdas 可以实现类似的效果。) -
只是不要将这两个函数称为相同的,大部分混淆都会消失。
标签: python c++ algorithm data-structures binary-tree