摘要
本文主要介绍了LeetCode二叉树的几个题目,包括102. 二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树。
1、102. 二叉树的层序遍历
1.1 思路
- 使用ArrayDeque,利用队列先进先出的特性
- 外层while循环判断队列是否为空,控制遍历次数
- 内层遍历队列,取出当前层的所有元素,如果当前节点的左右节点不为空,则加入到队列中
- 重复上述步骤,直至循环结束队列为空
1.2 代码
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
if(root == null) {
return list;
}
ArrayDeque<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while(!queue.isEmpty()) {
List<Integer> data = new ArrayList<>();
int size = queue.size();
for(int i=0; i<size; i++) {
TreeNode node = queue.pop();
data.add(node.val);
if(node.left != null) {
queue.offer(node.left);
}
if(node.right != null) {
queue.offer(node.right);
}
}
list.add(data);
}
return list;
}
2、226.翻转二叉树
2.1 思路
- 递归遍历,反转并重新设置当前节点的左右子树
- 如果当前节点为空,返回null
- 如果当前节点不为空,反转左子树和右子树,设置left为右子树,right为左子树
2.2 代码
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
3、101. 对称二叉树
3.1 思路
- 递归遍历,首先比较左子树是否与右子树相等
- 然后比较左节点的left与右节点的right是否相等,比较左节点的right与右节点的left是否相等
3.2 代码
public boolean isSymmetric(TreeNode root) {
return isSymmetric(root.left, root.right);
}
public boolean isSymmetric(TreeNode left, TreeNode right) {
if(left == null && right == null) {
return true;
}
if((left != null && right == null) || (left == null && right != null)) {
return false;
}
if(left.val != right.val) {
return false;
}
return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}