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