题目描述:
思路:
- 如何翻转二叉树? 其实就是把二叉树上的每个节点的左右子节点都交换一下。
- 那么如何实现?其实就是遍历二叉树的所有节点,然后对每一个节点实施【交换子节点】的操作
代码实现:
/**
1. Definition for a binary tree node.
2. public class TreeNode {
3. int val;
4. TreeNode left;
5. TreeNode right;
6. TreeNode() {}
7. TreeNode(int val) { this.val = val; }
8. TreeNode(int val, TreeNode left, TreeNode right) {
9. this.val = val;
10. this.left = left;
11. this.right = right;
12. }
13. }
*/
// 如何翻转二叉树: 其实就是把二叉树上的每个节点的左右子节点都交换一下,
// 那么如何实现呢? 那就是遍历二叉树的所有节点,并且对每个节点实施交换子节点的操作
class Solution {
public TreeNode invertTree(TreeNode root) {
// 出口
if (root == null){
return null;
}
// 前序遍历的位置
// 对于root节点,需要交换它的左右子节点
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
// 递归框架,遍历并交换所有子树节点
invertTree(root.left);
invertTree(root.right);
// 返回一个root,其实就是最后返回一颗二叉树
return root;
}
}
总结:
二叉树算法有两大类别:
-
遍历二叉树类型
在于只需要应用二叉树的递归遍历框架即可 -
分解子问题类型
在于明确递归函数的定义,然后利用这个定义即可 -
二叉树遍历框架就是这几行代码,可以遍历二叉树的所有节点:
关键在于自己判断算法应该使用哪一种遍历框架!!!
// 二叉树遍历框架
void traverse(TreeNode root) {
// 前序遍历
traverse(root.left)
// 中序遍历
traverse(root.right)
// 后序遍历
}