1. 本题知识点
树
2. 题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
对称的二叉树:
8
/ \
10 10
/ \ / \
11 9 9 11
3. 解题思路
-
如果根结点为空,则二叉树是对称的
-
如果根结点不为空,则判断根节点的左子树和右子树是不是对称
- 如果左右子树都为空,则二叉树是对称的
- 如果一个为空,另一个不为空,则二叉树不是对称的
- 如果两个结点值不相等,则二叉树不是对称的
- 递归以上过程,判断左子树的左子树和右子树的右子树是不是对称,及左子树的右子树和右子树的左子树是不是对称。
4. 代码
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
/**
* 判断 pRoot 是不是对称的二叉树
* @param pRoot
* @return
*/
boolean isSymmetrical(TreeNode pRoot) {
// 如果根结点为 null,则返回 true
if (pRoot == null) {
return true;
}
// 判断根节点的左子树和右子树是不是对称
return isSymmetrical(pRoot.left, pRoot.right);
}
/**
* 判断 pRoot1,pRoot2 是不是对称
* @param pRoot1
* @param pRoot2
* @return
*/
boolean isSymmetrical(TreeNode pRoot1, TreeNode pRoot2) {
// 如果两个结点都为 null,返回 true
if (pRoot1 == null && pRoot2 == null) {
return true;
}
// 如果一个结点为 null,另一个结点不为 null,返回 false
if (pRoot1 == null || pRoot2 == null) {
return false;
}
// 如果两个结点值不相等,返回 false
if (pRoot1.val != pRoot2.val) {
return false;
}
// 判断 pRoot1 的左子树和 pRoot2 的右子树是不是对称,
// 及 pRoot1 的右子树和 pRoot2 的左子树是不是对称。
return isSymmetrical(pRoot1.left, pRoot2.right) && isSymmetrical(pRoot1.right, pRoot2.left);
}
}