【LeetCode刷题日记01】101.对称二叉树

题目链接:
https://leetcode.cn/problems/symmetric-tree/description/?envType=problem-list-v2&envId=binary-tree

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

题目的目的很简单,判定一颗树是否轴对称。不过代码一开始用遍历代码改的效果并不好,总有意料之外的情况,如示例2、3过不去。

首先明确递归的输入,需要几个条件?这里采用两个,left与right,分别指代父节点的两个孩子;

则接下来明确递归终止条件。这里经验不足,因为之前思维惯性,不需要讨论,只需root满足一个条件后return;而这里两个指针,其实是有四个组合的。
left == right == null
left和right 一个为空
left和right都不为空

由终止条件继续讨论
当left == right == null时,说明父节点(调用节点)是叶子节点,叶子节点显然满足定义,孩子都是null,是对称的。
当left和right一个为空,显然不满足定义。
left和right都不为空时,分类讨论。
若left和right值不同,直接返回false,不满足定义。
否则,继续向下调用,查看left的左孩子和right的右孩子、left的右孩子和right的左孩子是否都能满足定义。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {

        return process(root.left,root.right);
    }
    public boolean process(TreeNode left,TreeNode right){ // 两个指针,三种情况,全不为null;只有1个位null;全都不为null;没思路的时候拿返回值是否为null作分类讨论;
    // 全不为null的情况,若值不等,则这个子树不可能是对称的,返回,否则继续向下挖字数的子树
    // 只有一个为null的情况,则说明不对称
    // 都为null,说明没法向下挖,父节点为叶节点,叶节点是对称的,返回true
        if((left == null && right != null) || (left != null && right == null) )
            return false;
        
        if(left == null && right == null)
            return true;

        if(left.val != right.val)
            return false;

        return process(left.left,right.right) && process(left.right,right.left);
    }


}

这题最大的收获是:当写不出来的时候不要盯着遍历的模板,而是需要灵活变通。想清楚应该函数定义怎么样的输入,由输入组合终止条件,具体情况具体分析!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值