十三:反转二叉树
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
}
以上是关于十三:反转二叉树的主要内容,如果未能解决你的问题,请参考以下文章