翻转二叉树
题目链接:添加链接描述
难度:简单
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 :
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
题外话:Homebrew的作者Max Howell,就是因为没在白板上写出翻转二叉树,最后被Google拒绝了。
二叉树节点定义
//二叉树节点的定义。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(){}
TreeNode(int val){
this.val = val;
}
TreeNode(int val,TreeNode left,TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
思路
这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次。
层序遍历依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的。
方式一:递归DFS
class Solution{
public TreeNode invertTree(TreeNode root){
if(root == null){
return root;
}
invertTree(root.left);
invertTree(root.right);
TreeNode tempNode = root.left;
root.left = root.right;
root.right = tempNode;
return root;
}
}
方式二:BFS迭代代码
class Solution{
public TreeNode invertTree(TreeNode root){
if(root == null){
return root;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int len = queue.size();
for (int i =0;i<len;i++){
TreeNode curNode = queue.poll();
TreeNode tempNode = curNode.left;
curNode.left = curNode.right;
curNode.right = tempNode;
if(curNode.left != null){
queue.offer(curNode.left);
}
if(curNode.right != null){
queue.offer(curNode.right);
}
}
}
return root;
}
}