到力扣链接
直接上干货 通俗易懂 注释详细
//递归法 前序遍历 后序遍历 从而实现二叉树的反转操作
//迭代法 利用栈这种数据结构来实现迭代 栈的底层其实也是递归
//层序遍历法 利用二叉树的层序遍历方法来实现
递归法
//递归 前序遍历 中左右
var invertTree = function(root) {
// 判断递归的终止条件
if(root === null)return root;
// 交换左右子树
let temp = root.left;
root.left = root.right;
root.right = temp;
// 递归的每一个步骤
invertTree(root.left); // 左
invertTree(root.right); // 右
return root;
};
//递归 后序遍历 左右中
var invertTree = function(root){
if(root === null)return root;
invertTree(root.left); // 先进行左递归
invertTree(root.right) // 进行右递归
// 交换左右子树的位置
let temp = root.left;
root.left = root.right;
root.right = temp;
return root;
}
迭代法
// 迭代版本之前序遍历实现
var invertTree = function(root){
// 定义一个用于交换左右节点的函数
function changeNode(root,left,right){
let temp = left;
left = right;
right = temp;
// 将形参赋值为真实的左右子树
root.left = left;
root.right = right
}
// 使用迭代法实现 无非就是借助一个栈来实现 因为js中是没有栈这种数据结构的 所以我这里就用数组来模拟栈
let stack = [];
if(root === null)return root;
// 将根节点放进栈中
stack.push(root)
while(stack.length){
// 如果stack里面还有数值的话 就走进来
let node = stack.pop(); // 将栈中最上面的元素抛出来 进行判断他是否有左右子树
if(node != null){
// 如果当前节点不为空的话 就进压栈
// 因为前序遍历是 中左右 所以进栈的顺序就应该是 右左中
node.right && stack.push(node.right);
node.left && stack.push(node.left);
stack.push(node);
// 这里之所以要pop一个null 是因为要标记中节点,else遇到null的时候才执行 而每一个节点都需要交换左右子树 所以在每一个节点的最后面都要来上一个null 这样在下一步就可以直接进行交换左右节点。
stack.push(null)
}else{
// 如果当前遍历的节点为空的话 就要进行交换左右子树的操作
node = stack.pop() // 当前弹出来的节点就是 上一层节点中间的那个节点 因为上一层节点最后放进栈中的是中间的节点 而非左右子树
//交换左右子树的操作
changeNode(node,node.left,node.right);
}
}
return root;
}
层序遍历法
// 层序遍历实现翻转二叉树
var invertTree = function(root){
// 定义一个函数 用于交换左右子树
function changeNode(node,left,right){
let temp = left;
left = right;
right = temp;
node.left = left;
node.right = right;
}
if(root === null) return root;
// 层序遍历的话 就是用队列来实现的利用队列的先进先出的特性
let queue = [];
queue.push(root);
while(queue.length){
// 记录二叉树的每一层节点的个数
let length = queue.length;
while(length--){
let node = queue.shift(); // 此时node获取的就是队列当中最前面的元素
// 节点交换逻辑
changeNode(node,node.left,node.right)
node.left && queue.push(node.left);
node.right && queue.push(node.right);
}
}
return root;
}