开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
给你一棵二叉树的根节点 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 = []
输出: []
解题思路
1. 递归
我们只需要在遍历二叉树的过程中,将每个节点下的左右孩子交换一下,就可以实现反转二叉树
需要注意的是,这道题可以使用前序遍历和后序遍历,唯独不能使用中序遍历
因为中序遍历【左中右】会先将左节点的左右孩子交换后
再交换中间节点的左右孩子
最后交换右节点的左右孩子
但最后一步的右节点其实是初始二叉树的左节点翻转过去的,而左节点的左右孩子已经在第一步翻转过了,所以左节点的孩子其实是反转了两次,而右节点的孩子并没有进行翻转
递归解法代码如下:
public TreeNode invertTree(TreeNode root) {
TreeNode node = inver(root);
return node;
}
public TreeNode inver(TreeNode root) {
if (root == null) {
return null;
}
//这里用的是前序遍历,即先进行交换,再遍历
swap(root);
inver(root.left);
inver(root.right);
return root;
}
public void swap(TreeNode root) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
2. 层序遍历
这道题也可以诶用层序遍历来解决,因为层序遍历也可以把每个节点的左右孩子都翻转一遍,代码如下:
public TreeNode invertTree(TreeNode root) {
Queue<TreeNode> quque = new LinkedList<>();
if (root != null) {
quque.offer(root);
}
while (!quque.isEmpty()) {
int size = quque.size();
for (int i = 0; i < size; i++) {
TreeNode node = quque.poll();
swap(node);
if (node.left != null) {
quque.offer(node.left);
}
if (node.right != null) {
quque.offer(node.right);
}
}
}
return root;
}
public void swap(TreeNode node) {
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
总结
对于二叉树的题,一定要清楚使用的是前中后序遍历,还是层序遍历,才能轻松的解决问题