「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
题目
226. 翻转二叉树
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
解法一
思路
二叉树的后序遍历。
我们可以递归的去遍历整颗树,递归的将当前根节点的左子树和右子树分别都反转,然后再将当前根节点的左子树和右子树反转即可,很显然,我们采用二叉树的后序遍历就刚好可以满足要求。
具体步骤如下
- 判断当前是否为空,如果是,则return,这其实也是递归终止条件
- 递归调用当前方法去处理左子树,将左子树递归的翻转完成
- 递归的去处理右子树,将右子树递归的翻转完成
- 然后再将当前节点的左子树和右子树交换
按以上步骤即可完成,是一个标准的二叉树的后序遍历。
代码如下
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
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),n为二叉树的节点数,因为我们需要去遍历二叉树的所有节点。
空间复杂度:O(n),空间复杂度由递归栈的层数决定,也即这里的二叉树的高度。平均状况下,二叉树的高度为logn,最坏的情况下,二叉树是一个联调,那么复杂度即为O(n)。
解法二
思路:
二叉树的中序遍历。
刚才用后序遍历,其实是先遍历到叶子节点,然后交换左右叶子节点,再返回上一级,去交换对称的两个叶子节点,然后再往上,将刚才处理好的两颗子树交换,然后再往上,一级一级的处理。
而采用中序遍历的话,刚好相反,上来就先将根节点的左右子树交换,然后再去处理左子树,将左子树根节点的两颗子树交换,依次往下,同理,然后再去处理右子树,整体思路刚好是相反的。
代码如下
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var invertTree = function(root) {
if(root == null){
return null;
}
let tmp = root.left;
root.left = root.right;
root.right = tmp;
invertTree(root.left);
invertTree(root.right);
return root;
};
复杂度分析
同上。