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
};