题目来源: JZ27 二叉树的镜像
题目描述:
- 描述: 操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围: 二叉树的节点数0≤n≤1000 , 二叉树每个节点的值0≤val≤1000
要求: 空间复杂度O(n) 。本题也有原地操作,即空间复杂度O(1) 的解法,时间复杂度O(n)
- 比如:源二叉树
- 镜像二叉树
- 比如:源二叉树
示例1:
输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
说明:如题面所示
示例2:
输入:{}
输出:{}
思路:栈
- 知识点:栈
- 栈,是一种线性表,它的特点是
先进后出,先进就是将元素入栈,放在栈的相对的最低端(如果此时栈内有元素,那么就是新元素放在该元素后面,理解为栈剩余空间的最低端),后出就是将栈中最顶端的元素删除,因为栈的进出使用的是同一个口,可以形象的理解成一个杯子.
- 栈,是一种线性表,它的特点是
- 具体做法:
- 1.优先进行的操作肯定是检查二叉树的情况:是否是空树
- 2.创建一个栈进行辅助操作,在遍历二叉树的时候,根节点最先进入到栈中
- 3.遍历过程中,每次弹出一个栈中的元素的时候,将该节点的左右孩子结点依次入栈
- 4.同时,因为求得是二叉树的镜像,所以我们要交换两个孩子结点的值,这样就保证了防止后续没有进行交换
- 图示:
具体实现:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
public TreeNode Mirror (TreeNode pRoot) {
// write code here
//空树
if(pRoot == null)
return null;
//辅助栈
Stack<TreeNode> s = new Stack<TreeNode>();
//根节点先进栈
s.push(pRoot);
while (!s.isEmpty()){
TreeNode node = s.pop();
//左右节点入栈
if(node.left != null)
s.push(node.left);
if(node.right != null)
s.push(node.right);
//交换左右
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
return pRoot;
}
}
- 复杂度分析:
- 时间复杂度O(n),其中n为二叉树的节点数,访问二叉树所有节点各一次
- 空间复杂度O(n),最坏情况下,二叉树退化为链表,栈的最大空间为n
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情”