力扣题目
解题思路
java代码
力扣题目:
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
解题思路:
算法原理:
这道题使用了递归的方式来实现二叉树的翻转。对于每个节点,将其左右子树进行递归翻转,然后交换左右子树的位置。
思路:
invertTree
方法中,如果节点为空则直接返回。否则,先递归处理左右子树,然后交换左右子树。printTree
方法使用层序遍历(广度优先搜索)来打印二叉树。通过一个队列来存储待处理的节点,每次取出队列头部的一定数量节点进行处理(即当前层的节点),并将它们的子节点加入队列,直到队列为空。
代码分析:
- 在
invertTree
方法中,通过递归调用自身来处理子树,然后交换根节点的左右子树。 - 在
printTree
方法中,创建一个队列,先将根节点加入队列。然后进入一个循环,在每次循环中,获取当前队列的大小作为当前层的节点数量。对于每个出队的节点,如果不为空则打印其值,并将其左右子节点入队(如果存在)。
时间复杂度:
invertTree
:O(n),其中 是二叉树的节点数量,因为需要遍历每个节点。printTree
:O(n),同样需要遍历每个节点。
空间复杂度:
invertTree
:O(n),其中 是二叉树的高度,递归栈的深度最大为树的高度。printTree
:O(n),主要是队列的空间开销,最坏情况下需要存储大约 个节点。
java代码:
package org.example.mouth8;
import java.util.LinkedList;
import java.util.Queue;
public class Leetcode226 {
public static void main(String[] args) {
TreeNode root = new TreeNode(4);
root.left = new TreeNode(2);
root.right = new TreeNode(7);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(3);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(9);
invertTree(root);
printTree(root);
}
public static 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;
}
public static void printTree(TreeNode root) {
if (root == null) {
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node!= null) {
System.out.print(node.val + " ");
if (node.left!= null) {
queue.offer(node.left);
}
if (node.right!= null) {
queue.offer(node.right);
}
} else {
System.out.print("null ");
}
}
System.out.println();
}
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项