「这是我参与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);
}
}