十三:反转二叉树

Posted JavaScript技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十三:反转二叉树相关的知识,希望对你有一定的参考价值。



前言

  • 将二叉树左右子树进行反转

思路

  • 时间复杂度:T: O(n)

  • 空间复杂度:S: O(n)

  • 采用递归的写法

  • 终止条件树为空

  • 将root左右子树进行交换

  • 递归分别传入左右子树

  • 最后返回反转后的二叉树


代码如下

/** * 反转二叉树 * @param {*} root 要反转的二叉树 */function reverseBinaryTree(root) { // 树为空时终止递归 if (!root) return root; // 左右子树进行交换 [root.left, root.right] = [root.right, root.left] // 递归将右子树反转 reverseBinaryTree(root.left) // 递归将左子树反转 reverseBinaryTree(root.right) // 返回反转后的二叉树 return root}

思路二

  • 时间复杂度:T: O(n)

  • 空间复杂度:S: O(n)

  • 树为空时直接返回该二叉树

  • 定义一个队列存放二叉树左右子树

  • 入栈二叉树

  • 通过遍历进行二叉树的左右子树交换

  • 终止条件,当前队列为空

  • 每次循环出栈最新的二叉树

  • 出栈后,进行左右子树交换

  • 然后如果左右子树存在的话,将左右子树分别入栈

  • 最后将反转后的二叉树返回

代码如下

/** * 反转二叉树 * @param {*} root 要反转的二叉树 */function reverseBinaryTree(root) { // 树为空时终止递归 if(!root) return root // 定义队列 const queue = [] // 入栈 queue.push(root) while (queue.length) { // 出栈 const current = queue.pop(); // 交换左右子树 [current.left, queue.right] = [current.right, current.left] // 重新入栈左右子数 if(current.left) queue.push(current.left) if(current.right) queue.push(current.right) } // 返回反转后的二叉树 return root}




以上是关于十三:反转二叉树的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中反转二叉树

剑指offer(三十三)之重建二叉树

leetCode题解之反转二叉树

剑指offer(五十三)之按之字形顺序打印二叉树

DS二叉树—二叉树镜面反转

需要帮助跟踪二叉树的这种反转方法