101. 对称二叉树

149 阅读1分钟

题目描述

leetcode-cn.com/problems/sy…

分析

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function(root) {

};

经过分析可以看到,对称二叉树实际上是要对比左树和右树对称的节点,对于一层的子节点:

比如根节点 root,下一层的节点需要对比的是 root.left, root.right,因为他们是对称的,再下一层:

root.left.left, root.right.right
root.left.right, root.right.left

解题思路

我用递归来完成一层节点的两两比较

数据结构,算法

递归

思路

再递归中,对两节点进行比较,在把对称的节点对通过递归去对比

比较两节点是否都为空

两节点都是空,返回 true

只有一个节点是空

只有一个节点为 null 说明不符合要求,不对称,返回 false

对比两个节点值

对比两节点值

递归

这里递归的时候左右两边的对称,左边传右节点,右边传左节点

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function (root) {
  const recursiveCompare = (l, r) => {
    if (!l && !r) return true
    if (!l || !r) return false

    return (
      l.val === r.val &&
      recursiveCompare(l.left, r.right) &&
      recursiveCompare(l.right, r.left)
    )
  }

  return recursiveCompare(root.left, root.right)
}