题目描述:
翻转一棵二叉树。
从题目描述来看,适合用递归,把每个节点的左右子树进行交换。
- 递归
法一:
从下往上进行交换,即在最后一层开始交换
public TreeNode invertTree(TreeNode root) {
if(root == null)
return null;
root.left = invertTree(root.left);
root.right = invertTree(root.right);
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
return root;
}
法二:
从上往下进行交换,即在第一层就开始交换
public TreeNode invertTree(TreeNode root) {
if(root == null)
return null;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
root.left = invertTree(root.left);
root.right = invertTree(root.right);
return root;
}
- 迭代
递归实现也就是深度优先遍历的方式,那么对应的就是广度优先遍历。
广度优先遍历需要额外的数据结构–队列,来存放临时遍历到的元素。
对每一个当前遍历到的节点进行左右子树的翻转,直到遍历结束。
(该题目本质上为对每个节点的左右子树翻转,所以只要遍历一次全交换即可,通过广度优先和深度优先都可完成)
public TreeNode invertTree(TreeNode root) {
if(root == null)
return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
TreeNode nodeTemp = node.left;
node.left = node.right;
node.right = nodeTemp;
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
}
return root;
}