目录
一、题目
1、leetcode链接:力扣
2、题目内容:
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
二、解题思路
1、二叉树翻转
(1)就是将根节点和所有子节点的左右子树进行交换;
(2)根节点:树的最顶端的节点,每颗树只有一个根节点;
(3)子节点:除了根节点,连接有节点的节点。
如下图:
2、具体步骤(迭代法)
(1)我们需要借助队列来实现,队列的特点是先进先出;
(2)判断树是否为空,不为空,让根节点进入队列;
(3)判断队列是否为空,为空则结束,不为空:
①记录当前队列长度,根据该长度进行遍历;
②队列元素出队;
③交换出队元素的左右子树;
④判断左节点是否为空,不为空,入队;
⑤判断右节点是否为空,不为空,入队;
(4)第二层操作,重复以上步骤
(5)第三层操作,重复以上步骤
![]()
(6)队列为空,二叉树翻转完成
![]()
三、代码实现
(1)首先要判断树是否为空,为空则不进行操作;
(2)每层操作之前,要用一个定值记录当前树长度,因为开始出队入队操作时,队列的长度是不断变化的。
public class t06 {
public static 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;
}
}
public TreeNode invertTree(TreeNode root) {
if (root==null){
return root;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
//记录当前队列长度
int len=queue.size();
for (int i = 0; i < len; i++) {
TreeNode node=queue.poll();
TreeNode temp=node.left;
node.left=node.right;
node.right=temp;
if (node.left!=null){
queue.add(node.left);
}
if (node.right!=null){
queue.add(node.right);
}
}
}
return root;
}
}