Published on

Leetcode 101

Authors
  • avatar
    Name
    Et cetera
    Twitter

101.Symmetric Tree

递归思路

class TreeNode {
  val: number
  left: TreeNode | null
  right: TreeNode | null
  constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    this.val = val === undefined ? 0 : val
    this.left = left === undefined ? null : left
    this.right = right === undefined ? null : right
  }
}

function isSymmetric(root: TreeNode | null): boolean {
  // 没有节点也是对称的
  if (!root) return true

  // 开始递归
  return isMirror(root.left, root.right)
}

function isMirror(left: TreeNode | null, right: TreeNode | null): boolean {
  // 左右节点都没有,是对称的
  if (!left && !right) {
    return true
  }
  // 左右节点只有一个,不是对称的
  if (!left || !right) {
    return false
  }

  // 左右节点都有,但是值不相等,不是对称的
  return (
    left.val === right.val &&
    isMirror(left.left, right.right) &&
    isMirror(left.right, right.left)
  )
}

迭代

class TreeNode {
  val: number
  left: TreeNode | null
  right: TreeNode | null
  constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    this.val = val === undefined ? 0 : val
    this.left = left === undefined ? null : left
    this.right = right === undefined ? null : right
  }
}

function isSymmetric(root: TreeNode | null): boolean {
  if (!root) return true

  // 开始迭代
  const queue: (TreeNode | null)[] = []
  queue.push(root.left, root.right)

  while (queue.length > 0) {
    const left = queue.shift()
    const right = queue.shift()

    // 左右节点都没有,是对称的
    if (!left && !right) {
      continue
    }
    // 左右节点只有一个,不是对称的
    if (!left || !right || left.val !== right.val) {
      return false
    }

    // 左右节点都有,但是值不相等,不是对称的
    queue.push(left.left, right.right)
    queue.push(left.right, right.left)
  }

  return true
}