day29 JZ27 二叉树的镜像(Java)

93 阅读2分钟

题目来源: JZ27 二叉树的镜像

题目描述:

  • 描述: 操作给定的二叉树,将其变换为源二叉树的镜像。 数据范围: 二叉树的节点数0≤n≤1000 , 二叉树每个节点的值0≤val≤1000 要求: 空间复杂度O(n) 。本题也有原地操作,即空间复杂度O(1) 的解法,时间复杂度O(n)
    • 比如:源二叉树
      • 420B82546CFC9760B45DD65BA9244888.png
    • 镜像二叉树
      • AD8C4CC119B15070FA1DBAA1EBE8FC2A.png
示例1:
输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
说明:如题面所示
示例2:
输入:{}
输出:{}

思路:栈

  • 知识点:栈
    • 栈,是一种线性表,它的特点是先进后出,先进就是将元素入栈,放在栈的相对的最低端(如果此时栈内有元素,那么就是新元素放在该元素后面,理解为栈剩余空间的最低端),后出就是将栈中最顶端的元素删除,因为栈的进出使用的是同一个口,可以形象的理解成一个杯子.
  • 具体做法:
    • 1.优先进行的操作肯定是检查二叉树的情况:是否是空树
    • 2.创建一个栈进行辅助操作,在遍历二叉树的时候,根节点最先进入到栈中
    • 3.遍历过程中,每次弹出一个栈中的元素的时候,将该节点的左右孩子结点依次入栈
    • 4.同时,因为求得是二叉树的镜像,所以我们要交换两个孩子结点的值,这样就保证了防止后续没有进行交换
  • 图示: 72ACF7563CFBBBDD12ECFC34F906D205.gif

具体实现:

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 天,点击查看活动详情