226. 翻转二叉树
Difficulty: 简单
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
Solution
解析:
此题个人感觉如果是第一次做的话,对于 递归 没有很深的感觉的话,可能比较难想象
- 做二叉树的题目,其实应该最先想到能不能通过 递归 的方式来做,大家最好是能养成一种惯性思维比较好
- 对于此题,首先看题能不能通过递归做,通过观察:可以发现只要把二叉树上每一个节点的左右子节点相互交换,最后得到的结果就是翻转之后的二叉树
Language: 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;
// 此处错误代码,第一次写的时候,我只是交换了节点的值(val部分交换),发现不对
// 题目要求我们应该是节点的交换,而一个节点包含三个部分:val left right
// int tmp = root.left.val;
// root.left.val = root.right.val;
// root.right.val = tmp;
// 此处代码改为:交换当前节点左右节点,包括 val left right
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
// 此处精髓:先递归节点的左节点(可以理解为左子树),在递归节点的右节点(同理为右子树)
invertTree(root.left);
invertTree(root.right);
return root;
}
}
总结
主要强调的就是递归:可以这样想,你对一个二叉树进行操作或运算,怎么才算是将这件事情做完呢?那当然就是对这个二叉树的左子树进行了操作或运算,然后在对右子树进行了操作或运算,等左右都操作完了,那么你这件事情就算是操作完了;好,现在我们对左子树从澳洲,然后我们又可以惊喜的发现,二叉树的左子树依然可以当成一个二叉树,那么我们又可以对这个二叉树进行相似的操作,然后一直操作下去,直到左边事情做完了;同理右边也可以这样操作了,这就是我认为对于二叉树的递归操作