代码随想录算法训练营第十五天|102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树
102. 二叉树的层序遍历
问题简述:对二叉树进行层次遍历,将每层节点val
存入List
,再将所有List
存入一个List
。
思考:这个之前学数据结构学过,用到了队列。
算法思路:队列存入每层元素。不断将队头元素值存入List
,再将队头的左右节点再次存入List
,最后推出队头。此时队列中为下一层元素,不断循环,最后遍历完所有层元素。
import java.util.*;
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
ArrayDeque<TreeNode> dq = new ArrayDeque<>();
List<List<Integer>> result = new ArrayList<>();
//将跟结点存入栈
if (root != null) dq.push(root);
while (!dq.isEmpty()){
//用于遍历当前层元素
int a = dq.size();
//用于储存当前层元素val
List<Integer> level = new ArrayList<>();
//将当前层元素存入,并添加下一层元素
for (int i = 0; i < a; i++) {
level.add(dq.peekFirst().val);
if (dq.peekFirst().left != null) dq.add(dq.peekFirst().left);
if (dq.peekFirst().right != null) dq.add(dq.peekFirst().right);
dq.pop();
}
//加入当前层元素List
result.add(level);
}
return result;
}
}
226.翻转二叉树
问题简述:将二叉树所有的左右节点翻转。
思考:这个之前学数据结构也学过,一定要后序遍历。
算法思路:后序遍历每个节点,交换每个节点的左右子树。
时间复杂度: O(n)
空间复杂度: O(1)
class Solution {
public TreeNode invertTree(TreeNode root) {
invert(root);
return root;
}
//还是先创建返回值为空的函数
public void invert(TreeNode root) {
//判断当前节点是否为空
if (root == null) {
return;
}else {
invert(root.left);
invert(root.right);
//最后再处理当前节点
TreeNode t = root.left;
root.left = root.right;
root.right = t;
}
}
}
101. 对称二叉树
问题简述:判断两个二叉树是否对称。
思考:最开始想着可以对比左根右遍历和右根左遍历结果的List
是否相同,后来发现不行,因为即使数字相同,数的结构可能也不同。
算法思路:将树的左右子树作为两个参数传入函数,如果当前左右结点不满足对称条件直接返回false
,如果满足条件,那么继续递归判断左结点的左子树和右结点的右子树;左结点的右子树和右结点的左子树是否对称。
时间复杂度 O(n)
空间复杂度 O(1)
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left, root.right);
}
public boolean compare(TreeNode left, TreeNode right) {
//如果一个为空一个不为空直接返回false
if (left == null && right != null) {
return false;
}
//如果一个为空一个不为空直接返回false
if (left != null && right == null) {
return false;
}
//如果都为空返回true
if (left == null && right == null) {
return true;
}
//如果不相等返回fasle
if (left.val != right.val) {
return false;
}
//如果函数运行到这只能说明两个结点数值相等,那么继续判断左结点的左子树和右结点的右子树;左结点的右子树和右结点的左子树是否对称
return compare(left.left, right.right) && compare(left.right, right.left);
}
}
感想
每道题方法都很多,目前都只掌握了一种方法,第三个递归感觉稍微有点不好理解,但还是搞清楚了。