力扣:翻转二叉树java
思路:
1.选择合适的遍历方式:最容易的是递归的先序和后序遍历,然后是迭代的先后序遍历,其次是层序遍历,最后是中序遍历(需要遍历的将取右节点改成左节点)
2.思考操作逻辑,实际上就是对二叉树所有节点左右孩子互换。
class Solution {
public TreeNode invertTree(TreeNode root) {//主函数
if(root == null) return root;
swapTree3(root);//调用翻转函数传入根节点
return root;
}
public void swapTree(TreeNode cur){//递归先序遍历,也可以使用后序遍历
if(cur == null) return;//结束条件
TreeNode tempNode = cur.left;//对节点操作,互换节点的左右孩子
cur.left = cur.right;
cur.right = tempNode;
swapTree(cur.left);//递归遍历左右孩子
swapTree(cur.right);
}
public void swapTree2(TreeNode cur){//迭代先序遍历
Stack<TreeNode> st = new Stack<>();//设置一个栈
st.push(cur);//根节点入栈
while(!st.isEmpty()){//栈不为空时,说明未遍历完成
TreeNode node = st.pop();//栈弹出一个节点
if(node!=null){ //该节点不为空,就进行互换左右孩子操作
TreeNode tempNode = node.left;
node.left = node.right;
node.right = tempNode;
}else{//为空则跳过本次循环
continue;
}
st.push(node.right);//对左右孩子入栈
st.push(node.left);
}
}
public void swapTree3(TreeNode cur){//层序遍历
Queue<TreeNode> queue = new LinkedList<>();//设置一个对列
queue.offer(cur);//输入根节点,也就是第一层进入对列中
while(!queue.isEmpty()){//对列不为空,说明还有二叉树层未遍历
int len = queue.size();//获取对列的长度,也就是一层的个数
while(len>0){//循环层数的长度次,弹出本层的所有节点
TreeNode node = queue.poll();//得到出队列操作的节点
TreeNode tempNode = node.left;//对该节点左右孩子互换
node.left = node.right;
node.right = tempNode;
if(node.left!=null) queue.offer(node.left);//该节点存在左右孩子就输入对列
if(node.right!=null) queue.offer(node.right);
len--;
}
}
}
}