小王的Java刷题日记Day10
记录刷题过程,作为笔记和分享,坚持每天刷题,每天进步,编程语言为Java。
(临近期末,事情太多啦)
题目:翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
思路一:递归法 简单常用
1、输出的左右子树的位置跟输入正好是相反的,于是我们可以递归的交换左右子树来完成这道题。
2、交换一下左右节点,然后再递归的交换左节点,右节点。
终止条件:当前节点为 null
时返回。
交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点
class Solution {
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;
}
}
思路二:应用队列,进行层序遍历
1、要先将根节点放入到队列中,然后不断的迭代队列中的元素。
2、对当前元素调换其左右子树的位置,然后:
- 判断其左子树是否为空,不为空就放入队列中
- 判断其右子树是否为空,不为空就放入队列中
/** 定义二叉树
* Definition for a binary tree node.
* public 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;
* }
* }
*/
class Solution {
// 方法用于反转二叉树
public TreeNode invertTree(TreeNode root) {
// 检查根节点是否为空,如果是则返回null
if (root == null) {
return null;
}
// 创建一个队列以执行层次遍历
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
// 将根节点添加到队列中
queue.offer(root);
// 执行层次遍历
while (!queue.isEmpty()) {
// 出队当前节点
TreeNode curr = queue.poll();
// 交换当前节点的左右子节点
TreeNode temp = curr.left;
curr.left = curr.right;
curr.right = temp;
// 如果左子节点存在,则将其入队
if (curr.left != null) {
queue.offer(curr.left);
}
// 如果右子节点存在,则将其入队
if (curr.right != null) {
queue.offer(curr.right);
}
}
// 返回反转后的二叉树
return root;
}
}