【剑指offer】对称的二叉树+二叉树的镜像

🔥题目

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

    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为二叉树的节点数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值