【面试-leetcode226】翻转二叉树(递归+迭代)

83 阅读2分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg 这是 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是二叉树的高度。但是在实际使用中,递归解法可能会由于递归调用栈的大小限制导致栈溢出的问题,而迭代解法则不会出现这个问题。因此,在实际使用中,迭代解法可能更加稳定和可靠

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接