原题目:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
解决办法:
第一反应是想中序遍历,比如说Symmetric Tree的中序遍历结果肯定是一个对称的字符串(3241423),显然这个过程是不可逆的,后来想如果还提供树的高度可不可以可逆,画了一下发现是不行,比如说下面这个过程:
1 1 / \ / \ 2 2 ==> 32123 ==> 3 2 / \ \ \ 3 3 2 3
还是老老实实递归好了,代码如下:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if(null == root)
return true;
return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode leftOne, TreeNode rightOne) {
if(leftOne == null && rightOne == null)
return true;
if((leftOne == null && rightOne != null) || (leftOne != null && rightOne == null))
return false;
return isSymmetric(leftOne.left, rightOne.right) && isSymmetric(leftOne.right, rightOne.left) && leftOne.val == rightOne.val;
}
}
既然递归实现了,那么循环加栈就简单了:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if(null == root)
return true;
if(root.left == null || root.right == null)
return root.left == null && root.right == null;
Stack<TreeNode> treeNodes = new Stack<TreeNode>();
treeNodes.push(root.left);
treeNodes.push(root.right);
while(treeNodes.size() > 0) {
TreeNode right = treeNodes.pop();
TreeNode left = treeNodes.pop();
if((left == null && right != null) || (left != null && right == null))
return false;
if(left != null && right != null) {
if(left.val != right.val)
return false;
treeNodes.push(left.left);
treeNodes.push(right.right);
treeNodes.push(left.right);
treeNodes.push(right.left);
}
}
return true;
}
}