您的位置:首页 > 编程语言 > Java开发

LeetCode-101. Symmetric Tree

2017-10-04 22:08 309 查看

问题描述

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

1

/ \

2 2

/ \ / \

3 4 4 3

But the following [1,2,2,null,3,null,3] is not:

1

/ \

2 2

\ \

3 3

解题思路

判断一棵树是不是镜像二叉树,采用从递归和非递归两种解决方式。

递归的方式求解,方法类似于LeetCode-100,只不过判断的条件变成:p的值是否等于q的值;p的左子树与q的右子树的翻转是不是相同;p的右子树与q的左子树的翻转是不是相同。

非递归的方式求解。首先将root的左节点p和右节点q放入到队列中(两个节点都不为空),然后从队列中弹出两个节点,判断这两个节点的值是否相同,如果p的左节点和q的右节点同不为null,将这两个节点添加到队列中,如果两个节点不同为null,返回false;如果p的右节点和q的左节点同不为null,将这两个节点添加到队列中,如果两个节点不同为null,返回false。循环,直到队列为空

代码

递归方式

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
return isSameTree(root.left,root.right);
}
private boolean isSameTree(TreeNode p,TreeNode q){
if((p == null && q != null) || (p != null && q == null))
return false;
if(p == null && q == null)
return true;
return p.val == q.val && isSameTree(p.left,q.right) && isSameTree(p.right,q.left);
}
}


非递归的方式

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(root.left == null && root.right == null)
return true;
if((root.left == null && root.right != null) || (root.left != null && root.right == null))
return false;
queue.add(root.left);
queue.add(root.right);
while(queue.peek() != null){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if(left.val == right.val){
if((left.left == null && right.right != null) || (left.left != null && right.right == null))
return false;
if(left.left != null && right.right != null){
queue.add(left.left);
queue.add(right.right);
}
if((left.right == null && right.left != null) || (left.right != null && right.left == null))
return false;
if(left.right != null && right.left != null){
queue.add(left.right);
queue.add(right.left);
}
}else{
return false;
}
}
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode-java