题目
![](https://i-blog.csdnimg.cn/blog_migrate/fdc6c452058aef033b4818cd4d3ecbc5.png)
思路
可用多种方法来做,这里给出递归和层序遍历的做法
法一:层序遍历
层序遍历法要借助queue这个数据结构
如果根节点为空,则直接返回
当节点不为空时,将其加入到队列中,当队列不为空的时候,开始遍历
先定义一个整数len用来表示队列的长度que.size(),当len-->0时,从队列中取出一个节点,交换这个节点的左右子树,然后判断左右子节点是否为空,然后再把节点的左右子节点加入到que中
最后不断遍历每一层,最终返回root
法二:递归
交换左右子节点
递归左子节点,递归右子节点
代码
法一
class Solution {
//层序遍历
public TreeNode invertTree(TreeNode root) {
if(root==null){
return root;
}
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
while(len-->0){
TreeNode node = que.poll();
swap(node);
if(node.left!=null){
que.offer(node.left);
}
if(node.right!=null){
que.offer(node.right);
}
}
}
return root;
}
public TreeNode swap(TreeNode node){
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
return node;
}
}
法二
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return root;
}
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public TreeNode swap(TreeNode node){
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
return node;
}
}
收获
重新复习了一遍递归法和层序遍历法