经典面试题(十六)--二叉树的镜像
Posted 算法和数据结构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典面试题(十六)--二叉树的镜像相关的知识,希望对你有一定的参考价值。
来源:LeetCode
难度:简单
描述:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
镜像输出:
示例1:
分析:
这是一道很经典的二叉树问题,首先咱们需要了解二叉树镜像的定义:对于对于二叉树中任意节点 root ,设其左 / 右子节点分别为 left, right ;则在二叉树的镜像中的对应 root节点,其左 / 右子节点分别为 right,left 。用一句话来描述其实就是针对二叉树任意节点,将其左右子节点交换后的结果就是镜像树
如图:
老规矩,这里介绍深度优先遍历和广度优先遍历两种方法来解题
解题
方法一:深度优先遍历(递归)
思路:从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转得到镜像。
如果当前遍历到的节点root 的左右两棵子树都已经翻转得到镜像,那么我们只需要交换两棵子树的位置,即可得到以root 为根节点的整棵子树的镜像。
代码:
1public TreeNode mirrorTree(TreeNode root) {
2 if (root == null) {
3 return null;
4 }
5 //翻转左节点
6 TreeNode left = mirrorTree(root.left);
7 //翻转右节点
8 TreeNode right = mirrorTree(root.right);
9 //左右翻转完毕,左右子节点进行交换即可
10 root.left = right;
11 root.right = left;
12 return root;
13}
时间复杂度:O(n) n是节点个数
空间复杂度:O(n)
方法一:广度优先遍历
思路:先将根节点放入到队列中,然后不断的迭代队列中的元素。对出队的每个元素调换其左右子树的位置,然后:
判断其左子树是否为空,不为空就放入队列中
判断其右子树是否为空,不为空就放入队列中
之后对队列的元素重复如上操作即可
代码:
1public TreeNode mirrorTree(TreeNode root) {
2 if(root==null) {
3 return null;
4 }
5 //将二叉树中的节点逐层放入队列中,再迭代处理队列中的元素
6 LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
7 queue.add(root);
8 while(!queue.isEmpty()) {
9 //每次都从队列中拿一个节点,并交换这个节点的左右子树
10 TreeNode tmp = queue.poll();
11 TreeNode left = tmp.left;
12 tmp.left = tmp.right;
13 tmp.right = left;
14 //如果当前节点的左子树不为空,则放入队列等待后续处理
15 if(tmp.left!=null) {
16 queue.add(tmp.left);
17 }
18 //如果当前节点的右子树不为空,则放入队列等待后续处理
19 if(tmp.right!=null) {
20 queue.add(tmp.right);
21 }
22 }
23 //返回处理完的根节点
24 return root;
25}
时间复杂度:O(n) n是节点个数
空间复杂度:O(n)
以上仅是个人思路解法,觉得还不错欢迎点赞关注分享
往期精彩推荐
以上是关于经典面试题(十六)--二叉树的镜像的主要内容,如果未能解决你的问题,请参考以下文章