题目描述

原题链接
给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:
image.png
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
image.png
输入:root = [1,2,2,null,3,null,3] 输出:false

提示:

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

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

个人解法

Javascript

递归

  1. /*
  2. * @lc app=leetcode.cn id=101 lang=javascript
  3. *
  4. * [101] 对称二叉树
  5. */
  6. // @lc code=start
  7. /**
  8. * Definition for a binary tree node.
  9. * function TreeNode(val, left, right) {
  10. * this.val = (val===undefined ? 0 : val)
  11. * this.left = (left===undefined ? null : left)
  12. * this.right = (right===undefined ? null : right)
  13. * }
  14. */
  15. const check = function (root1, root2) {
  16. if (root1 === null && root2 !== null) {
  17. return false;
  18. }
  19. if (root1 !== null && root2 === null) {
  20. return false;
  21. }
  22. if (root1 === root2) {
  23. return true;
  24. }
  25. if (root1.val === root2.val) {
  26. return check(root1.left, root2.right) && check(root1.right, root2.left);
  27. } else {
  28. return false;
  29. }
  30. }
  31. /**
  32. * @param {TreeNode} root
  33. * @return {boolean}
  34. */
  35. var isSymmetric = function (root) {
  36. return check(root.left, root.right);
  37. };
  38. // @lc code=end

Java

  1. class Solution {
  2. public boolean isSymmetric(TreeNode root) {
  3. //调用递归函数,比较左节点,右节点
  4. return dfs(root.left,root.right);
  5. }
  6. boolean dfs(TreeNode left, TreeNode right) {
  7. //递归的终止条件是两个节点都为空
  8. //或者两个节点中有一个为空
  9. //或者两个节点的值不相等
  10. if(left==null && right==null) {
  11. return true;
  12. }
  13. if(left==null || right==null) {
  14. return false;
  15. }
  16. if(left.val!=right.val) {
  17. return false;
  18. }
  19. //再递归的比较 左节点的左孩子 和 右节点的右孩子
  20. //以及比较 左节点的右孩子 和 右节点的左孩子
  21. return dfs(left.left,right.right) && dfs(left.right,right.left);
  22. }
  23. }

其他解法

Java

Javascript

迭代

题解链接

  1. var isSymmetric = function(root) {
  2. //迭代方法判断是否是对称二叉树
  3. //首先判断root是否为空
  4. if(root===null){
  5. return true;
  6. }
  7. let queue=[];
  8. queue.push(root.left);
  9. queue.push(root.right);
  10. while(queue.length){
  11. let leftNode=queue.shift();//左节点
  12. let rightNode=queue.shift();//右节点
  13. if(leftNode===null&&rightNode===null){
  14. continue;
  15. }
  16. if(leftNode===null||rightNode===null||leftNode.val!==rightNode.val){
  17. return false;
  18. }
  19. queue.push(leftNode.left);//左节点左孩子入队
  20. queue.push(rightNode.right);//右节点右孩子入队
  21. queue.push(leftNode.right);//左节点右孩子入队
  22. queue.push(rightNode.left);//右节点左孩子入队
  23. }
  24. return true;
  25. };