1.题目
给定一个二叉树,判断其是否是对称二叉树?
2.题目分析
(1)返回true;
(2)返回false;
3.程序设计
(1)若二叉树为空,是对称二叉树,返回true;
(2)若二叉树根节点的左右孩子均为null,是对称二叉树,返回true;
(3)若二叉树根节点的左右孩子只有一个为null,不是对称二叉树,返回false;
(4)若二叉树根节点的左右孩子均不为null,比较左(右)孩子值是否相等;
(5)若其左右孩子值相等,继续比较根节点左孩子的左孩子与根节点右孩子的右孩子是否对称,根节点左孩子的右孩子与根节点右孩子的左孩子是否对称;即递归的从第(2)开始;
4.程序源代码
//节点类
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public boolean isSymmetric(TreeNode root) {
//二叉树为空
if(root == null){
return true;
}
//比较根结点的左右子树是否对称
return compare(root.left,root.right);
}
//比较对称方法
private boolean compare(TreeNode p,TreeNode q){
//传入的子树均为空
if(p == null && q == null){
return true;
}
//传入的子树只有一个为空
if(p == null || q == null){
return false;
}
//比较传入子树的根节点值
//比较子树p的左孩子与子树q的右孩子是否对称
//比较子树p的右孩子与子树q的左孩子是否对称
return (p.val == q.val) && compare(p.left,q.right) && compare(p.right,q.left);
}