这里的问题是描述:后面确定二叉树思想过程是对称的
给定一个二叉树,检查它是否是自身的反射镜(即,围绕其中心对称)。
例如,这个二叉树[1,2,2,3,4,4,3]是对称的:
1
/\
2 2
/\/\
3 4 4 3
但以下的[1,2,2,空值,如图3所示,空,3]是不是:
1
/\
2 2
\ \
3 3
来源自:Determine if tree is symmetric
我花了很多时间来解决这个问题,我想出了解决的办法是办出水平序遍历并检查值在每个级别都是回文。这个实现通过了leetcode上的测试。但是,当我阅读社论时,我看到一个非常短暂的递归程序,并且一直困扰着我。
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root); }
public boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);}
- 一个如何证明上述递归版本的正确性? (我猜这可以通过归纳来证明吗?)
- 有人可以概述想出这样的解决方案的思考过程。你是否通过实际可视化调用堆栈来验证解决方案,还是有一个很好的高层思考框架来推断这些问题?
我明白,树是在自身的递归数据结构,即由遵循相同的结构,但由于某种原因,当我尝试验证该解决方案的有效性,左,右子树,我试图想象递归调用最终我的想法变得纠结。 This guy在解释调用堆栈如何展开作为递归进行时做了很好的工作,但我只是想改进我的思维过程以解决这种“简单”的递归问题,因此我在这里发布。
(FWIW,我所熟悉的递归/ DFS /回溯,以及如何呼叫流程,但我还是被卡住上来和验证高层次递归理念,为上述问题)
感谢您的帮助了。
感谢thebenman的调用堆栈可视化。看到解决方案之后,我可以找出它,但它有助于找出一种方法来推断算法的正确性,而无需实际模拟它。在那个方向,你会碰巧知道如何递归版本被证明是正确的? –