引言
- Google拒绝Homebrew作者推特原文
- 不要小看翻转二叉树, Homebrew的作者都能折戟, 更是国内面试中高级开发的一道分水岭
- 抛开技术涉猎范围不弹, 其实半小时就能搞懂并手敲出来
- 勤能补拙, 抽出半小时读完此贴, 你也能成功翻转二叉树👍
树的基本概念
二叉树
- 二叉树的性质
真二叉树(Proper Binary Tree)
- 所有节点的度要么为0, 要么为2
满二叉树(Full Binary Tree)
完全二叉树(Complete Binary Tree)
- 完全二叉树的性质
- 下面就不是完全二叉树
常考点
二叉树的遍历
- 遍历是数据结构中的常见操作, 把所有元素都访问一遍
- 线性结构的遍历比较简单, 正序遍历/逆序遍历
- 根据节点访问顺序的也不同, 二叉树的常见遍历方式有四种
-
- 前序遍历
-
- 中序遍历
-
- 后序遍历
-
- 层序遍历
前序遍历(Preorder Traversal)
- 访问顺序
中序遍历(Inorder Traversal)
- 访问顺序
-
- 中序遍历右子树、根节点、中序遍历左子树
后序遍历 (Postorder Traversal)
- 访问顺序
-
- 后序遍历左子树、后序遍历右子树、根节点
层序遍历 (Level Order Traversal)
- 访问顺序
-
- 从上到下、从左到右依次访问每一个节点
力扣226. 翻转二叉树
/**
* 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 tmpNode = root.left;
root.left = root.right;
root.right = tmpNode;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
// 后序遍历, 先左右, 再自己
invertTree(root.left);
invertTree(root.right);
TreeNode tmpNode = root.left;
root.left = root.right;
root.right = tmpNode;
return root;
}
}
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
// 中序遍历
invertTree(root.left);
TreeNode tmpNode = root.left;
root.left = root.right;
root.right = tmpNode;
invertTree(root.left);
return root;
}
}
脑子搞懂了, 手敲出来才是真懂! 既然看到这里, 就面对疾风吧, 下面是传送门