1. 程式人生 > >Microsoft leetcode (Symmetric Tree)

Microsoft leetcode (Symmetric Tree)

turn des ack for fff pub ret treenode gpo

Symmetric Tree

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

Recursive:
//1. For every level, if root‘s left == root‘s right then we can say it is symmetric.
//2. If root1 && root2 are null return true, if root1 || root2 is null return false.
class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  public TreeNode(int val) {
    this.val = val;
  }
}
public boolean isSymmetric(TreeNode root) {
  return isMirror(root, root);
}
public boolean isMirror(TreeNode root1, TreeNode root2) {
  if (root1 == null && root2 == null) return true;
  if (root1 == null || root2 == null) return false;
  return root1.val == root2.val && isMirror(root1.left, root2.right)
    && isMirror(root1.right, root2.left);
}

Iterative:

DFS -> Stack BFS -> Queue
Use stack to traverse all the nodes in the tree and check if left equals to right.

public boolean isSymmetric(TreeNode root) {
  if (root == null) return true;
  Stack<TreeNode> stack = new Stack<>();
  stack.push(root.left);
  stack.push(root.right);
  while(!stack.isEmpty()) {
    TreeNode n1 = stack.pop(), n2 = stack.pop();
    if (n1 == null && n2 == null) continue;
    if (n1 == null || n2 == null || n1.val != n2.val) return false;
    else {
      stack.push(n1.left);
      stack.push(n2.right);
      stack.push(n1.right);
      stack.push(n2.left);
    }
  }
  return true;
}

Microsoft leetcode (Symmetric Tree)