这是 leetcode 面试刷题一题多解系列的第12篇,练习分别使用递归和迭代的方式翻转二叉树。
题目
翻转二叉树
来源:力扣(LeetCode) 链接:leetcode.cn/problems/in… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1---递归
思路:首先判断当前节点是否为空,如果为空则直接返回null;否则将当前节点的左右子树进行翻转,然后交换左右子树的位置,最后返回翻转后的当前节点。这样递归地翻转整棵树。
var invertTree = function(root) {
if (root === null) {
return null;
}
let left = invertTree(root.left);
let right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
};
时间复杂度:每个元素都必须访问一次,所以是 O(n) 空间复杂度:最坏的情况下,需要存放 O(h) 个函数调用(h是树的高度),所以是 O(h)
题解2---迭代
迭代解法通过使用栈来模拟递归的过程,从而实现对整个二叉树的翻转。具体的代码如下:
思路:首先判断当前节点是否为空,如果为空则直接返回null;否则创建一个栈,将根节点入栈。然后不断地出栈节点,交换其左右子树的位置,如果左右子树不为空,则将左右子树分别入栈。最终返回翻转后的根节点。
var invertTree = function(root) {
if (root === null) {
return null;
}
let stack = [root];
while (stack.length !== 0) {
let node = stack.pop();
let left = node.left;
node.left = node.right;
node.right = left;
if (node.left !== null) {
stack.push(node.left);
}
if (node.right !== null) {
stack.push(node.right);
}
}
return root;
};
时间复杂度:同样每个节点都需要入队列/出队列一次,因此时间复杂度是O(n)
空间复杂度:使用一个栈来模拟递归的过程,因此空间复杂度也是O(h)。
因此,无论是递归解法还是迭代解法,它们的时间复杂度和空间复杂度都是一样的,都是O(n)和O(h),其中n是二叉树中节点的个数,h是二叉树的高度。但是在实际使用中,递归解法可能会由于递归调用栈的大小限制导致栈溢出的问题,而迭代解法则不会出现这个问题。因此,在实际使用中,迭代解法可能更加稳定和可靠
我的更多前端资讯
欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接