难度等级:容易
上一篇算法:
力扣此题地址:
1.题目:101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
2.解题思路:
递归解法:
思路:如果一个树的左子树和右子树都是对称的,那么这个树就是对称的。所以用递归的方式,深度进行层层遍历比较,一棵子树一棵子树的遍历;
两个数对称需要满足以下两种情况:
(1)它们的两个根节点具有相同的值
(2)每个树的右子树都与另一个树的左子树对称
代码思路:
实现一个递归函数,通过传入两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移,p左移时,q右移。每次检查当前p和q结点的值是否相等,如果相等在判断左右子树是否对称。
思路参考:
3.代码实现:
/**
* 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) {
//一开始两个指针都指向root
return check(root,root);
}
//传入两个指针p和q,分别遍历左子树和右子树进行比较判断
public boolean check(TreeNode p, TreeNode q) {
//进来方法中先判断两个树是否为null的情况
if(p == null && q == null){//如果两个树都为null,则一定是对称的
return true;
}
if(p == null && q != null || q == null && p != null){//如果两个树一个为null,一个不为null,则一定不对称
return false;
}
//如果p和q两个节点的值相等,并且p的左右子节点分别与q的左右子节点对称的话,则返回true
return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
}
}