递归翻转
思路:
- 终止条件:当前节点为空时,返回 null。
- 交换左右节点:先把遇到节点的左右子节点用一个 temp 节点交换。
- 递归处理子树:再递归调用方法,翻转当前节点的左子树,和右子树。
题解:
java
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;
}
迭代翻转
思路:
- 初始化:先将根节点加入队列。
- 各层级出队列循环:当队列不为空时,逐个取出现有队列里的所有元素。
- 交换和存入下一级:每取出一个节点就交换它的左右子节点。交换完成后,如果现在的左子节点或者右子节点不为空(此时位置已经交换),就将它们继续添加到队列里,用于下一层级的交换。
题解:
java
public TreeNode invertTreeIterative(TreeNode root) {
if (root == null) return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode cur = queue.poll();
// 交换当前节点的左右子节点
TreeNode temp = cur.left;
cur.left = cur.right;
cur.right = temp;
// 将左右子节点入队,以便后续处理
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
}
}
return root;
}