[树遍历的应用] 226. 翻转二叉树(递归DFS、迭代BFS)
226. 翻转二叉树
题目链接:https://leetcode-cn.com/problems/invert-binary-tree/
分类:
- 树(翻转二叉树、树的遍历:递归DFS,迭代BFS + 在遍历过程中翻转)
思路1:递归(DFS)
算法流程:
-
鲁棒性验证,快速处理边界用例
-
创建backup节点用于存放根节点,用于返回镜像树的根节点。
-
调用traverseAndMirror函数递归实现DFS遍历+翻转左右孩子:
(1)在遍历到的每个点上,交换它的左右孩子(包括null);再对它的左右子树调用traverseAndMirror,重复相同操作,
(2)直到遍历到叶子节点上时,不做任何处理,直接返回。
实现遇到的问题:特殊用例的处理
- 功能测试:树不止一个节点
- 边界测试:树为空;树只有一个节点
class Solution {
public TreeNode invertTree(TreeNode root) {
//1、鲁棒性验证
if(root == null || (root.left == null && root.right == null)){
return root;
}
//2、用于返回镜像树的根节点。
TreeNode backup = root;
//3、调用求二叉树镜像函数
traverseAndMirror(root);
return backup;
}
//前序遍历+镜像操作
public void traverseAndMirror(TreeNode root){
//递归出口:遍历到叶子节点上时,不做任何处理,直接返回。
if(root == null || (root.left == null && root.right == null)){
return;
}
//交换当前节点的左右孩子,并递归处理它的左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
traverseAndMirror(root.left);
traverseAndMirror(root.right);
}
}
思路2:迭代(BFS)
BFS对树而言就是层次遍历,层次遍历的实现前面已经做过很多次。
算法流程:
- 开辟一个队列用于层次遍历,先将根节点入队;
- 获取队列元素个数n,依次弹出n次队首,每弹出一个队首节点,就将其左右孩子调换,然后分别加入队列中。
- 队列为空时退出循环。
class Solution {
public TreeNode invertTree(TreeNode root) {
//鲁棒性验证
if(root == null || (root.left == null && root.right == null)){
return root;
}
//队列用于层次遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int n = queue.size();
for(int i = 0; i < n; i++){
TreeNode top = queue.poll();
TreeNode temp = top.left;
top.left = top.right;
top.right = temp;
if(top.left != null) queue.offer(top.left);
if(top.right != null) queue.offer(top.right);
}
}
return root;
}
}