My answer:
Recursive:
/** * 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 helper(root.left, root.right); } boolean helper(TreeNode left, TreeNode right) { if (left == null && right == null) { return true; } if ((left == null && right != null) || (left != null && right == null) ) { return false; } else { // left != null && right != null if (left.val == right.val) { return helper(left.left, right.right) && helper(left.right, right.left); } else { return false; } } } }
Iterative:
/** * 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; } LinkedList<TreeNode> currentLevel = new LinkedList<TreeNode>(); LinkedList<TreeNode> nextLevel = new LinkedList<TreeNode>(); currentLevel.addLast(root); while (true) { while(!currentLevel.isEmpty()) { TreeNode temp = currentLevel.removeFirst(); if (temp != null) { nextLevel.addLast(temp.left); nextLevel.addLast(temp.right); } } if (nextLevel.isEmpty()) { break; } int left = (nextLevel.size() - 1) / 2 ; int right = left + 1; while (left >= 0 && right < nextLevel.size()) { if (!equals(nextLevel.get(left), nextLevel.get(right))) { return false; } left --; right ++; } currentLevel.addAll(nextLevel); nextLevel = new LinkedList<TreeNode>(); } return true; } boolean equals(TreeNode node1, TreeNode node2) { if (node1 == null && node2 == null) { return true; } else { if (node1 != null && node2 != null && node1.val == node2.val) { return true; } } return false; } }
No comments:
Post a Comment