🔥题目
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
☘️解析
很常规的递归。但是终止条件中对于null的处理,要注意一下:
1)如果node1和node2都为null,则匹配成功
2)如果node1和node2中有一个为null,则匹配失败
另外,下面的代码中,递归的入口也非常巧妙:dfs(root, root)。
🧊代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return dfs(root, root);
}
private boolean dfs(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) {
return true;
}
if (node1 == null || node2 == null) {
return false;
}
return node1.val == node2.val && dfs(node1.left, node2.right) && dfs(node1.right, node2.left);
}
}
🌸补充
时间复杂度O(n),其中n为二叉树的节点数。
🔥题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:
4
/ \
7 2
/ \ / \
9 6 3 1
☘️解析
很常规的递归。
需要注意的是不能直接写root.left = mirrorTree(root.right); root.right = mirrorTree(root.left);
因为在调用第一个递归后,root.left的值已经改变,再递归调用mirrorTree(root.left)就会出错。因此需要 暂存 一下。
🧊代码
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode L = root.left;
TreeNode R = root.right;
root.left = mirrorTree(R);
root.right = mirrorTree(L);
return root;
}
}
🌸补充
时间复杂度O(n),其中n为二叉树的节点数。