题目
思路BFS
使用BFS遍历的时候交换
只需要对原有的BFS遍历时加上交换的代码即可(老三行)。
public TreeNode invertTree(TreeNode root) {
public TreeNode invertTree(TreeNode root) {
//root为空的情况要进行排除否则会在交换时出现空指针异常
if(root==null) {
return null;
}
//用层序遍历完成对二叉树的遍历
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
//进行交换
//temp相当于一个辅助指针帮助遍历这棵树
TreeNode temp = queue.poll();
TreeNode left = temp.left;
temp.left = temp.right;
temp.right = left;
if(temp.left!=null){ queue.add(temp.left);}
if(temp.right!=null){ queue.add(temp.right);}
}
return root;
}
}
思路DFS
用递归的方式求解,非常简单
public TreeNode invertTree(TreeNode root) {
//递归函数的终止条件,节点为空时返回
if(root==null) {
return null;
}
//下面三句是将当前节点的左右子树交换(老三行)
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
//递归交换当前节点的左子树
invertTree(root.left);
//递归交换当前节点的右子树
invertTree(root.right);
//函数返回时就表示当前这个节点,以及它的左右子树
//都已经交换完了
return root;
}