2024/5/22 今天雨天,没停过。耳机循环着《偏爱》,开始做题!
1、题目描述
2、逻辑分析
看到题目,我有点想到了之前做过的题目:对称二叉树。但是还是没啥头绪,看看题解先。
题解给出了递归的方法来实现。大致思路:递归遍历左右子树,先翻转叶子节点,从下至上的反转,最后到根节点就交换两棵子树的位置即可。
代码演示
public TreeNode invertTree(TreeNode root) {
// 如果根节点为空(即树为空),则返回null
if(root == null){
return null;
}
// 递归地反转左子树,并将反转后的左子树的根节点赋值给left变量
TreeNode left = invertTree(root.left);
// 递归地反转右子树,并将反转后的右子树的根节点赋值给right变量
TreeNode right = invertTree(root.right);
// 交换当前节点的左右子树,实现反转
root.left = right;
root.right = left;
return root;
}
过程解释:
-
递归的基本思想是将问题分解为更小的、相似的子问题,然后解决这些子问题。在这个问题中,反转一个二叉树可以被分解为反转其左子树和右子树,然后交换当前节点的左右子树。
-
首先,我们检查根节点是否为空。如果为空,则不需要进行任何操作,直接返回null。
-
然后,我们递归地反转左子树和右子树。递归调用invertTree方法会返回反转后的子树的根节点。
-
接下来,我们交换当前节点的左右子树。注意,这里的交换是基于我们已经得到了反转后的左子树和右子树的根节点。
-
最后,我们返回反转后的当前节点。这个节点在反转之前是原树的根节点,在反转之后仍然是新树的根节点(只是其左右子树被交换了)。