Skip to content
On this page

101. Symmetric Tree

https://leetcode.com/problems/symmetric-tree/

js
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
function isSymmetric(root) {
  const symmetric = (left, right) => {
    if (!left && !right) {
      return true
    }
    if (!left || !right) {
      return false
    }
    return left.val === right.val &&
      symmetric(left.left, right.right) &&
      symmetric(left.right, right.left)
  }

  return symmetric(root, root)
}
js
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
function isSymmetric(root) {
  const queue = [root, root]

  while (queue.length) {
    const p = queue.shift()
    const q = queue.shift()

    if (!p && !q) {
      continue
    }
    if (!p || !q) {
      return false
    }
    if (p.val !== q.val) {
      return false
    }

    queue.push(p.left, q.right, p.right, q.left)
  }

  return true
}
py
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution(object):

    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.symmetric(root, root)

    def symmetric(self, left, right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        return left.val == right.val and self.symmetric(left.left, right.right) and self.symmetric(left.right, right.left)
py
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution(object):

    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        queue = [root, root]

        while queue:
            p, q = queue[0], queue[1]
            queue = queue[2:]

            if not p and not q:
                continue
            if not p or not q:
                return False
            if p.val != q.val:
                return False

            queue += [p.left, q.right, p.right, q.left]

        return True
go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    return symmetric(root, root)
}

func symmetric(t1 *TreeNode, t2 *TreeNode) bool {
    if t1 == nil && t2 == nil {
        return true
    }
    if t1 == nil || t2 == nil {
        return false
    }
    return t1.Val == t2.Val && symmetric(t1.Left, t2.Right) && symmetric(t1.Right, t2.Left)
}
go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    q := []*TreeNode{root, root}

    for len(q) > 0 {
    	t1, t2 := q[0], q[1]
    	q = q[2:]

    	if t1 == nil && t2 == nil {
    		continue
    	}
    	if t1 == nil || t2 == nil {
    		return false
    	}
    	if t1.Val != t2.Val {
    		return false
    	}

    	q = append(q, []*TreeNode{t1.Left, t2.Right, t1.Right, t2.Left}...)
    }

    return true
}