题目链接
https://leetcode.cn/problems/invert-binary-tree/
1、题目要求
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
2、思路分析
翻转整棵树,可以将问题拆解成为很多个小问题,也就是将存在左结点以及右结点(比如结点 2 结点 7 都有左结点以及右结点)
的结点进行翻转。使得左结点以及右结点的位置进行交换,达到翻转的目的。
这里体现出来了递归的思想,重点是确定单层递归的逻辑、确定递归传递的参数以及递归停止的条件。
递归停止条件:
if (root == null) {
return null;
}
递归传递的参数:
invertTree(TreeNode root)
单层递归的逻辑:
找到有左右结点的结点,将该结点的左右结点交换即可。java 中,位置的交换体现在引用的交换。
invertTree(root.left);
invertTree(root.right);
swapNode(root);
3、执行代码
/**
* 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;
}
// 单层递归的逻辑,找到解决问题的最小单元
// 因为是二叉树,所以最小单元就是一个根节点和它的两个子节点,调换两个子节点的引用位置,
// 实现了节点的翻转
invertTree(root.left);
invertTree(root.right);
swapNode(root);
return root;
}
public void swapNode(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
4、小结
借着翻转整棵树这个题目,基于将问题拆解的思路,使用递归的方式进行求解,整体来说,是比较容易实现的。