剑指offer(20)——二叉树的镜像

173 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

 4

/
2 7 / \ /
1 3 6 9 镜像输出:

 4

/
7 2 / \ /
9 6 3 1

示例 1:

输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 思路 递归:首先交换根节点的左右子树,如果根节点的左子树不为空,递归交换左子树的左右子树,如果根节点的右子树不为空,递归交换右子树的左右子树 本题难点: 将 min() 函数复杂度降为 O(1)O(1) ,可通过建立辅助栈实现; 数据栈 AA : 栈 AA 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。 辅助栈 BB : 栈 BB 中存储栈 AA 中所有 非严格降序 的元素,则栈 AA 中的最小元素始终对应栈 BB 的栈顶元素,即 min() 函数只需返回栈 BB 的栈顶元素即可。 因此,只需设法维护好 栈 BB 的元素,使其保持非严格降序,即可实现 min() 函数的 O(1)O(1) 复杂度。

函数设计: push(x) 函数: 重点为保持栈 BB 的元素是 非严格降序 的。

将 xx 压入栈 AA (即 A.add(x) ); 若 ① 栈 BB 为空 或 ② xx 小于等于 栈 BB 的栈顶元素,则将 xx 压入栈 BB (即 B.add(x) )。 pop() 函数: 重点为保持栈 A, BA,B 的 元素一致性 。

执行栈 AA 出栈(即 A.pop() ),将出栈元素记为 yy ; 若 yy 等于栈 BB 的栈顶元素,则执行栈 B 出栈(即 B.pop() )。 top() 函数: 直接返回栈 AA 的栈顶元素即可,即返回 A.peek() 。

min() 函数: 直接返回栈 BB 的栈顶元素即可,即返回 B.peek() 。

代码

var mirrorTree = function(root) {
    if (root) {
        [root.left, root.right] = [root.right, root.left]
        mirrorTree(root.left)
        mirrorTree(root.right)
    }
    return root
}