226.翻转二叉树
题目
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目范围在 [0, 100] 内
- -100 <= Node.val <= 100
题解
只要是二叉树就需要考虑的一个问题,选择哪种遍历方式。
这道题需要翻转这棵二叉树,也就是以根元素为中心点,左右对应位置的节点互换。
对于根节点来说
[root.left,root.right] = [root.right,root.left]
我选择前序遍历,从上往下边遍历变交换左右节点。
递归三部曲
- 递归的参数和递归的返回值
参数是指向当前遍历到的节点,表示本次递归应该交换该节点的左右孩子节点。
最后题目需要返回的是根结点,所以只需要把第一次递归的根结点返回就行了。
var invertTree = function(root) {
return root;
}
- 递归的终止条件
当遍历到叶子节点说明本条路径已经走完了
if(root ==null)return root;
- 本次递归的逻辑
递归函数的作用可以抽象为:交换当前节点root的的左右孩子节点
本次交换完毕后,再接着去交换当前节点的左孩子节点root.left
的左右孩子节点,最后交换当前节点的右孩子节点root.right
的左右孩子节点。
[root.left,root.right] = [root.right,root.left];//交换左右节点
if(root.left)invertTree(root.left);
if(root.right)invertTree(root.right);
代码
//写法1
var invertTree = function(root) {
if(root ==null)return root;
[root.left,root.right] = [root.right,root.left];//交换左右节点
if(root.left)invertTree(root.left);
if(root.right)invertTree(root.right);
return root;
};
//写法2 因为每一层都会返回当前层的root节点,所以可以将root.left直接赋值给以root.right为根节点交换之后的子树。
var invertTree = function(root) {
if(root ==null)return root;
let leftNode = root.left;
root.left = invertTree(root.right);
root.right = invertTree(leftNode);
return root;
};