问题:给定一颗二叉树,判定其是否为对称二叉树(也就是说树是否依中轴线对称)。比如,下面这课二叉树是对称的:
1 / \ 2 2 / \ / \ 3 4 4 3而下面这颗树是不对称的:
1 / \ 2 2 \ \ 3 3
二叉树的结构为:
public boolean isSymmetric(TreeNode root){
return root == null || isSymmetricLR(root.left, root.right);
}
public boolean isSymmetricLR(TreeNode lnode, TreeNode rnode){
if(lnode == null || rnode == null)
return lnode == rnode;
if(lnode.val != rnode.val)
return false;
return isSymmetricLR(lnode.left, rnode.right) && isSymmetricLR(lnode.right, rnode.left);
}
方法二:非递归策略:核心思想是将根节点的左侧节点的左孩子和根右侧节点的右孩子同时放入队列(用栈、数组都可以)中,将根节点的左侧节点的右孩子和根右侧节点的左孩子同时放入队列中;然后每次从队列头中取出两个节点进行比较,如果节点值相等,则继续按照上述规则放入节点,再取出节点比较;如果节点值不相等或者是两个节点不同时为空,表明树肯定不是对称的。
public class Solution {
public boolean isSymmetric(TreeNode root){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode lnode,rnode;
if(root == null)
return true;
queue.add(root.left);
queue.add(root.right);
while(!queue.isEmpty()){
lnode = queue.poll();
rnode = queue.poll();
if(lnode == null && rnode == null)
continue;
if(lnode == null || rnode == null)
return false;
if(lnode.val != rnode.val)
return false;
queue.add(lnode.left);
queue.add(rnode.right);
queue.add(lnode.right);
queue.add(rnode.left);
}
return true;
}
}