101. Symmetric Tree
2017-02-06 15:53
127 查看
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree
But the following
Note:
Bonus points if you could solve it both recursively and iteratively.
对比left.left, right.right && left.right, right.left,如果val相等,继续递归。注意以下几点:
1、如果root==null,返回true
2、如果left或者right等于null,不能访问其左右节点和val,否则会outstack,所以要先判断left或者right等不等于null
代码如下:
Non-recursive(use Stack)--460ms:
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode left, right;
if(root.left!=null){
if(root.right==null) return false;
stack.push(root.left);
stack.push(root.right);
}
else if(root.right!=null){
return false;
}
while(!stack.empty()){
if(stack.size()%2!=0) return false;
right = stack.pop();
left = stack.pop();
if(right.val!=left.val) return false;
if(left.left!=null){
if(right.right==null) return false;
stack.push(left.left);
stack.push(right.right);
}
else if(right.right!=null){
return false;
}
if(left.right!=null){
if(right.left==null) return false;
stack.push(left.right);
stack.push(right.left);
}
else if(right.left!=null){
return false;
}
}
return true;
}
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
Note:
Bonus points if you could solve it both recursively and iteratively.
对比left.left, right.right && left.right, right.left,如果val相等,继续递归。注意以下几点:
1、如果root==null,返回true
2、如果left或者right等于null,不能访问其左右节点和val,否则会outstack,所以要先判断left或者right等不等于null
代码如下:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) { return true; } return helper(root.left, root.right); } public boolean helper(TreeNode left, TreeNode right) { /*if (left == null && right == null) { return true; } if (left == null || right == null) { return false; }*/ //above lines can simplify as following if (left == null || right == null) { return left == right; } if (left.val != right.val) { return false; } return helper(left.left, right.right) && helper(left.right, right.left); } }
Non-recursive(use Stack)--460ms:
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode left, right;
if(root.left!=null){
if(root.right==null) return false;
stack.push(root.left);
stack.push(root.right);
}
else if(root.right!=null){
return false;
}
while(!stack.empty()){
if(stack.size()%2!=0) return false;
right = stack.pop();
left = stack.pop();
if(right.val!=left.val) return false;
if(left.left!=null){
if(right.right==null) return false;
stack.push(left.left);
stack.push(right.right);
}
else if(right.right!=null){
return false;
}
if(left.right!=null){
if(right.left==null) return false;
stack.push(left.right);
stack.push(right.left);
}
else if(right.left!=null){
return false;
}
}
return true;
}
相关文章推荐
- LeetCode(101)Symmetric Tree
- Leetcode 101. Symmetric Tree 判断二叉树是否对称,注意写在两个方法中,递归时注意空的判断
- LeetCode 101:Symmetric Tree
- DFS:101. Symmetric Tree
- [LeetCode]101 Symmetric Tree
- Leetcode#101 Symmetric Tree
- leetcode[101]Symmetric Tree
- [LeetCode 101] Symmetric Tree
- 101:Symmetric Tree【树】【DFS】
- #101 Symmetric Tree
- leetcode[101]:Symmetric Tree
- LeetCode(101)Symmetric Tree
- [LeetCode]题解(python):101-Symmetric Tree
- Leetcode-101. Symmetric Tree
- leetcode-101-Symmetric Tree
- 【LeetCode】C# 101、Symmetric Tree
- Lettcode_101_Symmetric Tree
- 【leetcode c++】101 Symmetric Tree
- LeetCode 101 Symmetric Tree