[路飞]_程序员必刷力扣题: 226. 翻转二叉树

102 阅读1分钟

226. 翻转二叉树

翻转一棵二叉树。。

示例 1: 输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

  4
   /   \
  7     2
 / \   / \
9   6 3   1

备注: 这个问题是受到 Max Howell 的 原问题 启发的 :

谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

层序遍历

思路介绍

要反转二叉树,我们就需要处理没一个节点的左右子树,我们可以逐一处理

无论是层序还是深度优先,只要能拿到没一个节点,并处理即可达到效果

实现

处理边界条件root为空直接返回root

这里我们用一个stack栈来存放每一层的节点,并且将节点的子节点逐一push到我们stack中,直到stack为空,则遍历结束

每次我们从stack的头部shift()来拿到一个节点,对他的左右两颗子树的顺序进行交换,如果子树有效则继续push到stack中

遍历结束则返回root

var invertTree = function(root) {
    if(!root) return root
    var queue = []
    queue.push(root)
    while(queue.length>0){
        var node = queue.shift();
        var temp = node.left
        node.left = node.right
        node.right = temp

        if(node.right) queue.push(node.right)
        if(node.left) queue.push(node.left)
    }
    
    return root
};

递归法

思路 处理边界条件root为空直接返回root

我们直接交换树的两颗子树的位置,并且递归调用invertTree函数再次处理两颗子树

最后直接返回root

var invertTree = function(root) {
    if(!root) return root
    let temp = root.left
    root.left = root.right
    root.right = temp
    invertTree(root.left)
    invertTree(root.right)
    return root
};