❝
这是一道 「简单」 题
https://leetcode.cn/problems/invert-binary-tree/❞
题目
给你一棵二叉树的根节点 ,翻转这棵二叉树,并返回其根节点。
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
输入:root = [2,1,3]
输出:[2,3,1]
输入:root = []
输出:[]
提示:
-
树中节点数目范围在 内 -
题解
翻转二叉树,就是交换根结点的左右子节点,而左右子节点同样需要进行翻转,也就是说需要「交换翻转后的左右子节点」。
以 Java 代码为例:
TreeNode left = root.left;
TreeNode right = root.right;
// 交换翻转后的左右子节点
root.left = invertTree(right);
root.right = invertTree(left);
以上代码片段明显可以看出使用的是递归的思路。既然使用递归,我们就需要确定递归的三要素:
-
递归函数:交换根节点的翻转后的左右子节点。 -
边界条件:根节点为空,无需交换。 -
还原现场:无需还原。
Java 代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
TreeNode left = root.left;
TreeNode right = root.right;
root.left = invertTree(right);
root.right = invertTree(left);
return root;
}
}
Go 代码实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
left, right := root.Left, root.Right
root.Left = invertTree(right)
root.Right = invertTree(left)
return root
}
复杂度分析
-
时间复杂度:,为二叉树中节点的个数,每个节点交换子节点的时间复杂度为,总共有个节点,所有总的时间复杂度为。 -
空间复杂度:,空间复杂度为调用栈的深度,最多为层,即二叉树退化成链表的时候。
– End –
原文始发于微信公众号(i余数):【算法题解】31. 翻转二叉树的递归解法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/193847.html