今天题目不算难,我们来个二叉树大集合
T94:二叉树的中序遍历
题目理解 :
给定一个二叉树根节点root,返回它的中序遍历结果。
核心思路(递归)
递归的本质:
当前节点的结果 = 左子树结果 + 当前节点 + 右子树结果
每次调用:
dfs(node)
其实是在做:
遍历"以 node 为根的整棵子树"
代码实现
java
//创建结果集合
List<Integer> res=new ArrayList<>();
//调用递归函数
dfs(root,res);
//返回结果
return res;
//中序遍历
private void dfs(TreeNode node,List<Integer> res){
//中止条件:节点为空
if(node==null){
return ;
}
//遍历左子树
dfs(node.left,res);
//中间
res.add(node.val);
//右
dfs(node.right,res);
}
题目感悟
第一次接触树结构,有一些语法需要熟悉,比如:TreeNode
感觉着这就像基础数据,需要记牢,并没有考察太大的思维点。
流程:
创建List集合存放数据
定义中序遍历函数dfs------>终止条件,左遍历,访问中间节点,右遍历。
T104:二叉树的最大深度
题目要求:求二叉树的最大深度
核心思想
本题挺简单的,就只有一个小易错点
不要将返回的长度忘记+1,也就是忘了把根节点加上去。
代码实现
java
class Solution {
public int maxDepth(TreeNode root) {
// 终止条件:空节点深度为0
if (root == null) {
return 0;
}
// 递归计算左子树深度
int leftDepth = maxDepth(root.left);
// 递归计算右子树深度
int rightDepth = maxDepth(root.right);
// 返回最大深度 + 当前节点
return Math.max(leftDepth, rightDepth) + 1;
}
}
本题感悟
- 别忘了+1
- 查找树深度的语法为maxDepth();
T226:翻转二叉树
题目要求:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
简单来说,就是将左子树与右子树进行位置互换
纠正一个概念
我第一下看到返回值是一串数字,下意识认为需要创建一个结果集合来存放结果。但其实只需要return root就行了。
rootroot = 一个数字(比如 4) ❌ 这个理解是不对的
root是节点对象里面包含三种元素
java
root = {
val: 4,
left: (节点2),
right: (节点7)
}
代码实现
java
class Solution {
public TreeNode invertTree(TreeNode root) {
// 终止条件
if (root == null) {
return null;
}
// 交换左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
// 递归翻转左右子树
invertTree(root.left);
invertTree(root.right);
return root;
}
}
本题感悟
- 递归思想:自己调用自己
T101:对称二叉树
题目要求:给你一个二叉树的根节点 root , 检查它是否轴对称。
核心思路
本题不是遍历一颗树
而是:
同时比较两颗镜像树
一句话核心:
左子树的左 == 右子树的右
左子树的右 == 右子树的左
代码实现
java
class Solution {
public boolean isSymmetric(TreeNode root) {
// 空树一定对称
if (root == null) return true;
// 比较左右子树
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode left, TreeNode right) {
// 情况1:都为空 → 对称
if (left == null && right == null) {
return true;
}
// 情况2:一个为空,一个不为空 → 不对称
if (left == null || right == null) {
return false;
}
// 情况3:值不相等 → 不对称
if (left.val != right.val) {
return false;
}
// 情况4:递归比较"镜像位置"
return isMirror(left.left, right.right)
&& isMirror(left.right, right.left);
}
}
本题感悟
- 比较的概念,是左子树的左 == 右子树的右 左子树的右 == 右子树的左
- 关于是否镜像对称的判断,分为5步:1.root是否为空 2.是否都为空3.是否一个是空一个不是空 4.左右值是否相等 5.继续递归比较