「前端刷题」101. 对称二叉树

82 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

题目

链接:leetcode-cn.com/problems/sy… 给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

**输入:**root = [1,2,2,3,4,4,3] **输出:**true

示例 2:

**输入:**root = [1,2,2,null,3,null,3] **输出:**false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

**进阶:**你可以运用递归和迭代两种方法解决这个问题吗?

思路

本代码很清晰,使用的是递归的思路去处理,由于镜像对称,那么意味着每个节点的左子树与右子树都是相对对称的,这样我们可以获得一个递归的思路,递归去比较左子树与右子树,则

  • 当left(左子树)的值等于right(右子树)的值,即left与right不单独存在一个null,也就是可以同时为null,或val相等时,返回true

  • 当遇到left与right的值不等,即left不同为null,且val不等时,中止遍历,返回false

  • 否则继续向下遍历:

    • left的左节点与right的右节点 dfs(left.left, right.right)
    • left的右节点与right的左节点 dfs(left.right, right.left)

代码

/**
 * 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) {
  if (root == null) {
    return true;
  }
  function dfs(left, right) {
    if (left == null && right == null) {
      return true;
    }
    if (left == null || right == null) {
      return false;
    }
    if (left.val != right.val) {
      return false;
    }
    return dfs(left.left, right.right) && dfs(left.right, right.left)
  }
  return dfs(root.left, root.right)
};

思路2

效率肯定不是很好,但是逻辑也比较直观。

体现了将问题转化为已解决问题的思路。

致命缺点是二叉树节点特别多的时候,要先把整个二叉树转换为数组。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3

按照左中右的顺序输出至数组是,[3,2,4,1,4,2,3],这时数组也是对称的。

为了去除巧合情形,可以使用 节点值,层数 的形式;

输出 ["3,3", "2,2", "4,3", "1,1", "4,3", "2,2", "3,3"];

例如:

    1
   / \
  2   2
 /    / 
2    2

不加层数输出的是[2,2,1,2,2],数组是对称的;

加上层数输出为["2,3", "2,2", "1,1", "2,3", "2,2"],数组就不是对称的了。

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function (root) {
    if (root == null) {
        return true;
    }
    //左中右顺序递归二叉树
    var nums = [];
    search(nums, root, 1);
    //判断是否对称
    var i = 0, j = nums.length - 1;
    while (i < j) {
        if (nums[i] != nums[j]) {
            return false;
        }
        i++;
        j--;
    }
    return true;
};
/**
 * 按照左中右顺序递归二叉树,输出至数组nums中
 * @param nums      输出
 * @param n         节点
 * @param k         层次
 */
function search(nums, n, k) {
    //左边
    if (n.left != null) {
        search(nums, n.left, k + 1);
    }
    //节点值,层次
    nums.push(n.val + ',' + k);
    //右边
    if (n.right != null) {
        search(nums, n.right, k + 1);
    }
}